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);