我正在研究如何借助指针显示二维数组的元素。这是我试过的代码:
#include<stdio.h>
int main(){
int arr[3][2] = {
{7, 8},
{6,3},
{3,4}
};
printf("%u\n", (arr + 2));
printf("%u\n", *(arr + 2));
}
输出:
6487616
6487616
我期望 *(arr + 2)
的输出为 3
。它与 (arr + 2)
有何相同之处?
最佳答案
二维数组实际上是数组的数组。
表达式 arr + 2
的类型为 int (*)[2]
,而 *(arr + 2)
的类型为 整数 [2]
。打印前者时,您有一个指针,以便打印指针的值。在后一种情况下,您有一个数组衰减到指向第一个元素的指针。所以 *(arr + 2)
衰减为 arr + 2
,这与第一个表达式相同。
深入了解 arr + 2
,arr
的类型为 int [3][2]
。当你向它添加一个整数值时,它会衰减为指向第一个成员的指针,因此 arr
会衰减为类型 int (*)[2]
,并且 arr + 2
也有那个类型,并指向包含 { 3, 4 }
的子数组。
另请注意,指针应使用 %p
格式说明符打印,并且指针必须转换为 void *
,否则您将调用 undefined behavior .在这种情况下,您很“幸运”,因为他们碰巧打印了同样的东西。
要获得您期望的 3 的输出,您需要再取消引用一次:
*(*(arr + 2))
关于c - (arr + 2) 等同于 *(arr + 2) 。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52062706/