c语言指针算术运算,C语言指针用法详解(二) 指针的算术运算

例题1:

Question :

char a[20];

int *ptr = (int * )a;

ptr++

Practice :

c语言指针算术运算,C语言指针用法详解(二) 指针的算术运算_第1张图片

Reason :

#include

using namespace std;

int main()

{

char a[20];

int *ptr = (int * )a;/// 强制类型转换不会改变a的类型

/***

** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里

** ptr 的类型是 int* , 指向的类型是 int , 指向整形变量 a

***/

cout<

ptr++;

cout<< " sizeof (ptr) "<< sizeof(ptr)<

/***

** ptr 类型是指针,指针的自增,当然是增加自身的大小了

** sizeof(ptr) 为4, ptr 增加4

***/

cout<

}

c语言指针算术运算,C语言指针用法详解(二) 指针的算术运算_第2张图片

例题2:

Question :

int arr[20] = {0};

int *ptr = arr;

for (int i=0; i<20; i++)

{

(*ptr)++;

ptr++;

}

Practice :

c语言指针算术运算,C语言指针用法详解(二) 指针的算术运算_第3张图片

Reason :

#include

using namespace std;

int main()

{

int arr[20] = {0};

int *ptr = arr;

/***

** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里

** ptr 的类型是 int* , 指向的类型是 int , 指向 arr

***/

for (int i=0; i<20; i++)

{

(*ptr)++; /// 改变的是 ptr 指向的值

ptr++; /// 改变的是 ptr 指向的地址 ,再次验证 ptr 自增的是 sizeof(ptr)

cout<

}

}

c语言指针算术运算,C语言指针用法详解(二) 指针的算术运算_第4张图片

例题3:

Question :

char a[20] ="You_are_a_girl;

int *ptr = (int *)a;

ptr += 5;

Practice:

c语言指针算术运算,C语言指针用法详解(二) 指针的算术运算_第5张图片

Reason

#include

using namespace std;

int main()

{

char a[20] = "You_are_a_girl";

int *ptr = (int * )a;

/***

** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里

** ptr 的类型是 int* , 指向的类型是 int , 指向 a

***/

cout<

ptr += 5;

/***

** ptr + 5 : 编译器处理为 ptr 的值加上 5 * sizeof(int)

** ptr 向高地址移动20个字节, 此时超出a 的合法范围, 但是语法可以

** 我也不懂 这里为什么超出 a 的合法范围 ????求教

***/

cout<

}

c语言指针算术运算,C语言指针用法详解(二) 指针的算术运算_第6张图片

例题4:

Question :

char a[20] = "You_are_a_girl";

char *p = a;

char **ptr = &p;

printf("**ptr = %c \n", **ptr);

ptr++;

printf("*ptr = %c \n", **ptr);

Practice :

Reason

#include

using namespace std;

int main()

{

char a[20] = "You_are_a_girl";

char *p = a;

char **ptr = &p;

/***

** 吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里

** p 的类型是 char* , 指向的类型是 char , 指向 a

** ptr 的类型是 char ** , 指向的类型是 char* , 指向 &p

***/

printf("**ptr = %c \n", **ptr);

/*cout<

cout<

cout<

ptr++;

cout<

cout<

/// ptr自增 ,增加的是它指向的类型的 所占字节

printf("*ptr = %c \n", **ptr);

/// 此时 *(ptr) 没人知道回事什么,也许是随机值,也许是非法操作

}

总结:

1. 一个指针ptrold 加或减一个整数n后,结果是一个新的指针ptrnew

ptrold指针的类型 和 ptrnew指针的类型 相同

ptrold指针指向的类型 和 ptrnew指针指向的类型 相同

ptrold指针的指向(值)和 ptrnew指针的指向(值)相差为指向类型的字节数

2.两个指针不能作加法运算,非法操作

3.两个指针可以作减法操作,但必须类型相同

吐吐吐吐吐吐吐槽: 博客园好难用。。。。。。

你可能感兴趣的:(c语言指针算术运算)