为什么打印出 sizeof() 指针与变量时会得到 2 个不同的输出

Why do i get 2 different output from when printing out the sizeof() pointer vs variable

为什么我在同一个地址打印值时会得到 2 个不同的输出?

指针 ptr 指向被访问元素 (bar) 的索引 0。

还是显示不同的结果?

unsigned int bar[5];


int main(){

unsigned int * ptr = &bar[0];

printf("%lu\n",sizeof(ptr)); // Console output : 8 (bytes)
printf("%lu\n",sizeof(bar[0])); //Console output : 4 (bytes)
  return 0;
}

ptr 是一个 unsigned int *。这种指针的大小在那个环境下是8个字节。

bar[0] 是一个 unsigned int。在该环境中,它的大小是 4 个字节。

也许您认为自己使用的是 *ptr

Why do i get 2 different output from when printing out the value in the same address?

这两个语句

printf("%lu\n",sizeof(ptr)); // Console output : 8 (bytes)
printf("%lu\n",sizeof(bar[0])); //Console output : 4 (bytes)

不输出“同一地址中的值”。

第一条语句输出类型为unsigned int *的指针ptr的大小。这个语句相当于

printf("%zu\n",sizeof( unsigned int * )); // Console output : 8 (bytes)

printf 的第二次调用输出 unsigned int 类型对象的大小。这个调用相当于

printf("%zu\n",sizeof( unsigned int ) ); //Console output : 4 (bytes)

正如您所见,在 printf 的这两个调用中,带有运算符 sizeof 的表达式的参数是不同的

printf("%zu\n",sizeof( unsigned int * )); // Console output : 8 (bytes)
printf("%zu\n",sizeof( unsigned int ) ); //Console output : 4 (bytes)

如果您将 printf 的第二个调用重写为以下方式

printf("%zu\n",sizeof( bar + 0 ) ); //Console output : 8 (bytes)

那么你将得到与第一次调用产生的值相同的值,因为表达式 bar + 0 具有类型 unsigned int *,这是由于数组指示符隐式转换为指向它的指针此表达式中的第一个元素。