正确的输出结果为:
分析:首先,a与&a的地址是一样的,但含义不一样。
a是数组元素的首地址,即a[0]的首地址;&a是数组的首地址,即整个数组的首地址。
区别在于,a+1表示数组下一个元素的地址,即a[1]的地址;而&a+1表示下一个对象(数组)的首地址。换而言之,就是在做指针的加减法的时候,地址偏移量的单位是不一样的,前者的偏移量单位是元素,后者的偏移量单位是对象。
其次,sizeof(a)和sizeof(&a)的区别,
sizeof(a)是把a作为一个数组类型来测试,结果是数组占用的字节数,
sizeof(&a)是把&a作为一个地址类型来测试,结果是该地址类型所占用的字节数。
因此,可以看出,sizeof(b)=32,因为数组b[4]中的元素是double类型的,一个double类型元素占8个字节,因此8*4=32;而sizeof(&b)=4,是因为double类型的指针,也只是占4个字节,事实上,所有的指针也都是占4个字节(这里指的是32位系统,如果是64位系统,可能是8。)。
根据以上分析,由于a是数组a的第一个元素的首地址,即a[0]的首地址,a+1就是a[1]的首地址,因此*(a+1)=a[1]中的数值,即2。
&a是数组的首地址,&a+1的地址就是&a+整个数组的长度,即&a+5*sizeof(int),然后(int*)将其强制转换为int类型,因此p也是int类型指针,显然,p指向的地址,已经超越了数组a[5]的界限了,由于数组a[5]的末地址再往后加1的这个地址中内容不明确,因此,*p的数值也不明确。
p是int类型指针,p-1就是在p指向的地址的基础上,减去sizeof(int),那么p-1指向的就是a[4]的首地址,因此*(p-1)=a[4]的内容,*(p-1)=5。
时间: 2024-12-28 10:36:06