C 知道初始地址的指针的地址
我有以下代码:C 知道初始地址的指针的地址,c,pointers,memory-address,C,Pointers,Memory Address,我有以下代码: int main(){ int tab[5]={10, 20, 30, 40, 50}; int *ptr; ptr=tab+4; printf("%d,%#x,%#x. \n",*ptr-1,&tab,ptr); return 0;} “标签”位于从裙子0x28FEF8开始的记忆区域中 我知道*ptr-1的值是49,&tab的值是0x28FEF8 有人能解释一下为什么“ptr”的值是0x28FF08吗?我猜应该是0x28FEFC 提前谢谢你 如果我们按照内存中的布局“
int main(){
int tab[5]={10, 20, 30, 40, 50};
int *ptr;
ptr=tab+4;
printf("%d,%#x,%#x. \n",*ptr-1,&tab,ptr);
return 0;}
“标签”位于从裙子0x28FEF8开始的记忆区域中
我知道*ptr-1的值是49,&tab的值是0x28FEF8
有人能解释一下为什么“ptr”的值是0x28FF08吗?我猜应该是0x28FEFC
提前谢谢你 如果我们按照内存中的布局“绘制”您的数组,它将看起来像
+----+----+----+----+----+
| 10 | 20 | 30 | 40 | 50 |
+----+----+----+----+----+
如果&tab[0]
等于0x28fef8
,那么&tab[4]
等于0x28fef8+sizeof(int)*4
,因为它指向int
数组的索引4,实际上是0x28ff08
请注意,虽然&tab[0]
和&tab
指向同一位置,但它们在语义上是不同的&tab[0]
是指向单个元素的指针,类型为int*
,而&tab
是指向数组的指针,类型为int(*)[5]
请注意,打印
void*
指针的正确格式是%p”
。所以你的印刷应该是
printf("%d,%p,%p. \n", *ptr-1, (void *) &tab, (void *) ptr);
请注意,确实需要对
void*
进行强制转换。谢谢您的回答,我现在就知道了!:)
printf("%d,%p,%p. \n", *ptr-1, (void *) &tab, (void *) ptr);