#include<stdio.h> int main(void) { int a[5] = {1,2,3,4,5}; int *p = (int *) (&a + 1); printf("%d,%d",*(a+1),*(p-1)); printf("\n"); return 0; }
答案是2,5
*(a+1)就不说了.
说下这个:
&a + 1;
a 于 &a 的值是一样的,但是有很大的区别:
区别在于
a+1
与
&a+1
的值是不一样的
a+1是给a加上一个sizeof(int)
而&a+1则是给a加上5×sizeof(int)
所以int *p = (int *) (&a + 1);之后. P 是指向a[5]的,又可以说指向下一个数组的首地址.(假设连续)
然后再经过p-1,则指向 a[4] , *p就是5了.
============================
补充一些别人关于指针的话语:
a:是数组的首地址即&a[0]
&a:以整个数组为单位取其地址.
a+1是a+sizeof(a[0])
&a+1是a+sizeof(a)
=======================
这样理解一下:
一个数据的类型,等于指向这个数据的数据类型,
比如:
int a;
int *p=&a;
那么a的类型为int, &a的类型为int *;
再如:
int a[2]={1,2};
int *p=a;
那a的类型为int *
但是&a的类型呢?我们可以设定一个指向&a的数据类型,请看下列式子:
int *p1=&a;
编译提示出错,不能把int(*)[6]型转换为int *型。
由此我们可以知&a的类型是int (*)[6]型。
那么我们可以列一个式子:
int (*p1)[6]= &a;
=======================
a是指向数组首元素的地址
&a是指向数组的地址
两者在数值上一样,但意义上不同
地址相同,并不代表它们是一样的.
所谓的指针有两重含义.
1.地址(比如0x1234)
2.类型
而第二种"类型",是代表这你高诉计算机,怎样去看待这个0x1234开始的内存,
char类型的,那么计算机就认为是0x1234是char类型的,每次访问它只提取一个字节.
int类型的,那么计算机就会将以0x123开始的四个字节合起来看做为一个int,每次都是读4个字节.
所以,char* ptr的++,和int* ptr的++是完全不同的.
而在这里其关键作用的是类型,就是计算机怎么来看待这段内存.
浙公网安备 33010602011771号