首先看一段程序:
[cpp:nogutter]
view plain
copy
#include
intmain()
{
inta[5]={1,2,3,4,5};
int*p=(int*)(&a+1);
printf("%d,%d/n",*(a+1),*(p-1));
return0;
}
输出结果为:
2, 5
#include
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int* p = (int*)(a + 1);
printf("%d, %d /n", *(a + 1), *(p - 1));
return 0;
}
第一个结果好说,a+1后指针指向了数组中的‘2’。 而第二个为什么输出‘5’呢。 原理是c语言中的指针加减后,会根据指针的类型采用不同的偏移量。
比如, int* a; int* b = a+1; 则 b - a = sizeof(int)
char* a; char* b = a+1;则b -a = sizeof (char)
将上述程序改写如下,更容易认识其本质
[cpp:nogutter]
view plain
copy
intmain()
{
inta[5]={1,2,3,4,5};
int(*ptr)[5]=&a+1;
//int*p=(int*)(&a+1);
int*p=(int*)ptr;
printf("%d,%d/n",*(a+1),*(p-1));
return0;
}
其中只是引入了一个中间变量 ptr指针, ptr指针的类型是 指向数组长度为5的指针, 所以 ptr + 1 其实是加了sizeof(a)的字节量,
ptr+1后指向了从a后面,即a开始数第6个字节。
注意指向数组指针的写法。括号不能丢。
int a[n], 则a是一个数组类型,而不是int型了,要注意正确对待。
a与&a的值一样,但意义不一样, a+1的偏移量为一个int,相当于&a[0], &a+1的偏移量为真个数组。是数组类型的指针。
如果觉得《c语言指针偏移量加偏移量 C语言中的指针加减偏移量》对你有帮助,请点赞、收藏,并留下你的观点哦!