main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf(“%d,%d”,*(a+1),*(ptr-1));
}
写出上面打印的结果。
*(a+1)大家都可以知道他的结果,就是Array的第二个成员的值,那&a+1代表什么呢!
int nData[2] = { 1,2 };
printf("nData = %p\n",nData); // 1
printf("nData = %p\n",&nData); // 2
printf("nData = %p\n",nData+1); // 3
printf("nData = %p\n",&nData+1); // 4
printf("%d\n",sizeof(nData)); // 5
printf("%d\n",sizeof(&nData)); // 6
输出的结果:
nData = 0012FF34
nData = 0012FF34
nData = 0012FF38
nData = 0012FF3C
8
4
可以看到1和2的结果是一样的,3比4大正好一个int空间。
前两天不是刚写关于数组和指针的区别,在使用数组表达式时,数组名的值是一个指针常量,指向数组的第一个成员。他的类型取决于数组元素的类型,本例中数组名称就是指向int的指针常量。因此就会出现1和3相差一个int的情况就是4字节。那为什么3和4也相差4个字节呢。这是就是&nData的意义。
在此之前先要了解1和2的区别,他们显示的结果都一样,但是取值的方式不一样。那就要说一种特殊情况:即当sizeof(nData)和&nData时,nData不能作为指针常量来表示,sizeof返回的是数组的长度,而&nData表示一个指向数组的指针,显示的地址是第一元素的,他的大小就是数组的大小,程序6所显示的结果。&nData+1代表的意思就是在nData的地址上+sizeof(nData)+1。