关于指针的算术运算

定义一个指针P
指针P的运算包括:+ - 不包括* /
猜测:指针P++
1.增加一个数组
2.增加一个字节
3.增加一个单位(格子)

(1)若P++为增加一个数组,则直接加到另一个数组,明显推断错误

(2)(3)分析:代码如下:
#include
int main()
{
int arr[10]={1,2,3};
int *p=arr;
p++;
*p=10;
printf("%d,%d\n",arr[0],arr[1]);
return 0;
}

关于指针的算术运算_第1张图片
容易看出arr[1]赋值成了20
所以初步猜测P++为增加一个单元格。
利用格子图分析:

关于指针的算术运算_第2张图片

所以 P++为增加一个单元格

猜测:P–和P++同理即p–为减少一个单元格
分析:代码如下:

#include
int main()
{
int arr[10]={1,2,3};
int *p=arr;
p=&arr[1];
p–;
*p=10;
printf("%d,%d,%d\n",arr[0],arr[1],arr[2]);
return 0;
}
关于指针的算术运算_第3张图片

所以***P–为减少一个单元格***

定义两个整型指针p,q
p+q:指针存放的地址过大会出现越界
p-q:单位是单元格,计算方法为:先算出相差的字符数再除以sizeof(指针本身去掉一个*)
例题代码如下:
#include
int main()
{
int arr[10] = {0};
int *p = &arr[1];
int *q = &arr[9];
printf("%d\n",p-q);
printf("%d\n",q-p);
printf("%d\n",(char )q-(char)p);
printf("%d\n",(float *)q-(float *)p);
printf("%d\n",(double **)q-(double **)p);//只去掉一个指针,若编译器为64位结果为4
printf("%d\n",(unsigned int)q-(unsigned int)p);//非指针,直接pq所保存的地址相减即(x+32)-x
return 0;
}
关于指针的算术运算_第4张图片

你可能感兴趣的:(关于指针的算术运算)