Closed zhangyachen closed 6 years ago
void main(){ int ints[20] = {10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200}; int *ip = ints + 3; printf("%p\n",ints); printf("%p\n",&ints); printf("%p\n\n",ints+4);
printf("%d\n",ints);
printf("%d\n",&ints);
printf("%d\n",ints+4);
} 输出结果: 0018FEF8 0018FEF8 0018FF08
1638136 1638136 1638152
参考一下!
答案应该是以%d十进制输出地址的吧
《C与指针》第8章课后问题8.7.1 :
我们只关注原题目中三个表达式的求值 :
ints的值很明显,是100。在几乎所有使用数组名的表达式中,数组名的值是一个指针常量,也就是数组第一个元素的地址。只有两种例外情况 :
int *
,&ints值类型为int (*)[10]
。&ints值也为100。&ints取得是整个数组的地址,即100。但是上面说了,ints与&ints类型不一样。
&ints+4的值,课后答案写的是116,即100 + 4 4。但是这点我不太认同,因为&ints的值类似是一个指向数组的指针,&ints与一个整数进行相加时,会首先根据指针指向的数组长度进行调整,然后再执行加法。所以,我认为的答案是100 + 4 20 * 4 = 420。
写了个程序验证一下 :
输出 :
很明显,0x7fff5dd63b40 = 0x7fff5dd63a00 + 140(320的十六进制表示)。与我的想法一致。
但是,该课后答案的错误在网上没有找到,也没有在原书的勘误表中找到。所以先记下来,希望有人能看到这篇文章,进而证实我想法的正确性,或者指出我的错误。