c语言 - 为什么输出 *(arr + k) != *(&arr + k),尽管两者都引用到相同的地址



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

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

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

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

arr + k&arr + k必须相同

它们是不一样的。

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

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

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

表达式arr&arr计算结果为同一地址,但它们具有不同的类型:

arr - int *
&arr - int (*)[5];

指针算术考虑了指向类型的大小,因此arr + 1计算下一个int的地址,而&arr + 1计算下一个5 元素数组的地址int

+----+
arr[0] : |  8 | <--- arr, &arr
+----+
arr[1] : |  7 | <--- arr + 1
+----+
arr[2] : |  5 |
+----+
arr[3] : | 11 |
+----+
arr[4] : |  2 |
+----+
| ?? | <--- &arr + 1
+----+
| ?? |
+----+
| ?? |
+----+
| ?? |
+----+
| ?? |
+----+
arr

(根据定义(是第一个元素的地址(因此它是指向数组基类型的指针,在本例中为int(,而&arr是数组的地址,因此它是int[5]*的类型(指向 5ints 数组的指针(。 当您使用(arr + 5)时,您正在计算(指针算术(指向int的指针的值并将其向上移动 5 位(int大小的 5 倍(。 当你说(&arr + 5)你正在计算指向int[5]的指针的值,并将其移动 5 倍于一个 5int秒的数组大小。 这是您移动前一个指针的五倍。这使得两个地址不同,因为尖头类型的大小不同。 结果值也会有所不同(*(arr + 5)是指向数组第五个位置的值,而*(&arr + 5)是位于内存中 25ints 的值(5ints 的数组(,但作为数组,当延迟给出第一个元素的地址时, 您将获得存储在内存中高 25 位的整数的值。

最新更新