首页 > 解决方案 > 为什么输出 *(arr + k) != *(&arr + k) 尽管两者都引用了相同的地址

问题描述

我正在尝试打印数组的内容。请找到代码。

int main(){
    int k = 2;
    int arr[5] = {8,7,5,11,2};
    printf("arr   %p\n", arr);
    printf("&arr  %p\n", &arr);
    printf("*(arr + k)    %p\n", *(arr + k));
    printf("*(&arr + k)   %p\n", *(&arr+k));
}

我得到低于上述程序的输出,其中 arr + k 和 &arr + k 必须相同。

arr   0x7ffe4e76ab60
&arr  0x7ffe4e76ab60
*(arr + k)    0x5
*(&arr + k)   0x7ffe4e76ab88

标签: carrayspointers

解决方案


arr + k并且&arr + k必须相同

他们不一样。

arr + k中,前进k步骤(每个步骤的大小等于)并产生与衰减( )sizeof *arr类型相同的值。arrint*

&arr + k中,前进k步骤(每个步骤的大小等于)并产生与( )sizeof arr类型相同的值。&arrint(*)[5]

2个表达式的步长不同。首先是每个元素的大小;其次是整个数组的大小。


推荐阅读