C 类型和指针地址
假设doubleC 类型和指针地址,c,pointers,pointer-arithmetic,C,Pointers,Pointer Arithmetic,假设doubleu[100]的第一个元素具有地址0x1000,并且sizeof(double)是8。什么是 printf("%p %p\n", &u[3] - 1, &u[20] - 5) 输出 家庭作业的答案是 echo '0x1010 0x1078' 他们是如何完成第二部分的呢 如果&u[0]==0x1000,则&u[1]==0x1008,&u[2]==0x1010&u[3]==0x1018 请记住,0x表示十六进制数,因此0x1010是0x1000+16(以
u[100]
的第一个元素具有地址0x1000
,并且sizeof(double)
是8
。什么是
printf("%p %p\n", &u[3] - 1, &u[20] - 5)
输出
家庭作业的答案是
echo '0x1010 0x1078'
他们是如何完成第二部分的呢 如果&u[0]==0x1000,则&u[1]==0x1008,&u[2]==0x1010&u[3]==0x1018 请记住,0x表示十六进制数,因此0x1010是0x1000+16(以10为基数) 然后你需要知道,在c中,如果你有一个double*并且你从中减去1,那么这个值将减少sizeof(double),而不是1。这称为“指针算术”
因此,您总共有&u[3]-1==0x1018-8==0x1010首先,要意识到数组是连续内存位置中的一系列值:因此
u
的内存布局如下:
0x1000: u[0]
0x1008: u[1]
0x1010: u[2]
0x1018: u[3]
0x1020: u[4]
0x1028: u[5]
因此,如果您执行了printf(“%p\n”,&u[3])
(这意味着“printf
一个指针(%p
)指向u[3]
”)的地址(&
),您希望看到0x1018
)
但是您的代码显示&u[3]-1
,因此您可能认为它会打印一个小于0x1018或0x1017
。但是C的工作原理不同:&u[3]
是指向double的指针,因此“比那少一个”是前一个double:0x1010
您可以为
&u[20]-5应用类似的参数欢迎使用SO。由于各种原因,问题被否决。不要因为落选而气馁。有经验的用户的问题和答案也会被否决。请参阅。@RSahu:您应该添加一些问题,这些问题必须至少表明提问者自己在解决问题方面做出了一些努力。事实上,这是投反对票的正当理由。如果问题中包含对合理的DVs的咆哮,则类似。格式不好的问题也不会吸引积极的反馈。@Michael Gaskill:如果你编辑,请全部编辑。(20-5)*sizeof(double)=0x78