请解释C中指针的含糊不清?

dej*_*avu 21 c pointers

#include<stdio.h>
main()
{ int x[3][5]={{1,2,10,4,5},{6,7,1,9,10},{11,12,13,14,15}};


printf("%d\n",x); 
printf("%d\n",*x); }
Run Code Online (Sandbox Code Playgroud)

这里首先printf将打印第一个元素的地址.那么为什么第二个printf不会在地址x处输出值,即第一个值.要打印我需要写的值**x.

jpa*_*cek 28

对于指针,x[0]是一样的*x.由此得出*x[0]的结果与之相同**x.

*x[0]:

x是a int[3][5],int(*)[5]在表达式中使用时转换为.因此x [0]是类型的左值int[5](第一个5元素"行"),它再次被转换为int*,并且取消引用它的第一个元素.

*x沿着相同的行进行求值,除了第一个取消引用是用星号(而不是索引)完成,并且没有第二个取消引用,所以我们最终得到了类型的左值int[5],它被printf作为指向第一个元素的指针传递给它.


Jas*_*son 5

当数组用作函数的参数时,它会衰减成指向数组第一个元素的指针.话虽这么说,x衰变的对象的类型是指向第一个子数组的指针,第一个子数组是指向数组int或基本上的数组的指针int (*)[5].当你调用时printf("%d\n",*x),你不是要给整数值printf,而是指向第一个子数组的指针x.由于该子数组也将衰减为指向第一个子数组元素的指针,因此您可以**x取消引用该后续指针并获取第一个子数组的第一个元素x.这实际上与*x[0]通过运算符优先级将索引到第一个子数组x,然后取消引用指向第一个子数组将衰减的第一个子数组的元素的指针相同.