我正在研究如何借助指针显示2D数组的元素.这是我试过的代码:
#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));
}
Run Code Online (Sandbox Code Playgroud)
输出:
6487616
6487616
Run Code Online (Sandbox Code Playgroud)
我期待的输出*(arr + 2)是3.它怎么样(arr + 2)?
dbu*_*ush 14
2D数组实际上是一个数组数组.
表达式arr + 2有类型int (*)[2],而*(arr + 2)有类型int [2].打印前者时,您有一个指针,以便打印指针的值.在后一种情况下,你有一个数组衰减到指向第一个元素的指针.因此*(arr + 2)衰减成arr + 2,与第一个表达式相同.
详细介绍arr + 2,arr有类型int [3][2].当你向它添加一个整数值时,它会衰减到指向第一个成员的指针,因此arr衰减为type int (*)[2],并且arr + 2也有该类型,并指向包含的子数组{ 3, 4 }.
另请注意,指针应使用%p格式说明符打印,并且必须将指针转换为指针void *,否则将调用未定义的行为.在这种情况下,你"幸运"他们碰巧打印相同的东西.
要获得您期望的3的输出,您需要再次取消引用:
*(*(arr + 2))
Run Code Online (Sandbox Code Playgroud)