此问题已在此处有答案:
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)
地址上的值吗?
3条答案
按热度按时间5kgi1eie1#
值相同,但类型不同:
int(*)[4]
(指向4个int的数组的指针)vsint *
(指向int的指针,但在将其传递给函数导致隐式转换之前,它是int[4]
,一个4个int的数组)。这两个值分别是
&arr[1]
和&arr[1][0]
。第一个子数组和它的第一个元素具有相同的地址。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
。bkkx9g8r3#
arr + 1
是4
项块的地址。*(arr + 1)
是1
项的地址。