C语言 为什么 *(arr+1)在多维数组中带来与arr+1相同的值?[副本]

htzpubme  于 2023-06-28  发布在  其他
关注(0)|答案(3)|浏览(168)

此问题已在此处有答案

Shouldn't dereferencing a pointer provide the value inside the address that you are referencing to?(1个答案)
4天前关闭。
我对多维数组和指针表示法有疑问,如下所示。

int arr[2][4] = {{1,2,3,4}, {5,6,7,8}};
printf("%d\n", (arr+1));
printf("%d\n", *(arr+1));

为什么在两个printf()调用中,打印的结果是相同的?两者都将第二个数组的地址带入arr。第一个我理解,因为arr是一个内存地址,因此,向它添加1会将指针向前移动(内部数组的大小 * 整数的大小)。但是对于第二个我很困惑,因为如果我把*放在(arr+1)之前,它不应该是(arr+1)地址上的值吗?

5kgi1eie

5kgi1eie1#

值相同,但类型不同:int(*)[4](指向4个int的数组的指针)vs int *(指向int的指针,但在将其传递给函数导致隐式转换之前,它是int[4],一个4个int的数组)。
这两个值分别是&arr[1]&arr[1][0]。第一个子数组和它的第一个元素具有相同的地址。

g52tjvyc

g52tjvyc2#

(arr)指向2 * 4数组的第一个存储器地址,即arr[0][0]
(arr+1)指向包含arr的第二个一维数组,即它指向数组arr[1]
现在,*(arr+1)基本上是包含arr的第二个一维数组的第一个元素的地址,即它指向元素arr[1][0]
如果你很了解指针,arr[1]arr[1][0]是同一个地址。
您可以通过检查**(arr+1)来确认这一点,在您的情况下,它将输出5

bkkx9g8r

bkkx9g8r3#

arr + 14项块的地址。
*(arr + 1)1项的地址。

相关问题