首先看下面这个程序
#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;
}