首先看下面这个程序
#include <stdio.h> int main() { int a[] = {1,2,3,4,5}; int *p = (int*)(&a+1); printf("%d\n",*(p-1)); return 0; }
结果是5,分析如下:
指针加减时(如p++)结果主要是由p的类型决定的,在这个例子中a表示一个int[5]型数组,那么&a就表示一个指向数组的指针,&a++就相当于是a[6],结果自然可知了。
这里可以写成:
int a[5]; int (*ptr)[5] = &a; //注意a等价于&a[0],只表示一个元素的地址。&a才表示数组的地址 //&a表示数组指针,a表示int型整数指针 //printf("%p %p\n",a,&a);//虽然这里打印的值一样,但表示的含义不一样 int *p = (int *)(ptr+1);
学习之后判断一下下面程序吧
#include <stdio.h> #include <string.h> int main() { char* a[] = {"hello","the","world"}; //printf("%d\n",sizeof(a[1]));//表示"hello","the","world"后面都隐藏了一个'\0' char **p = a; p++; printf("%s\n",*p); return 0; }