首先看一段程序:
- #include <stdio.h>
- 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;
- }
输出结果为:
2, 5
第一个结果好说,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)
将上述程序改写如下,更容易认识其本质
- int main()
- {
- int a[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));
- return 0;
- }
其中只是引入了一个中间变量 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的偏移量为真个数组。是数组类型的指针。