Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 类型和指针地址_C_Pointers_Pointer Arithmetic - Fatal编程技术网

C 类型和指针地址

C 类型和指针地址,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(以

假设double
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