假设mat
是指向大小为5
的数组的指针,其中每个元素都是整数
int (*mat)[5];
并且我已经将其初始化为
int a[5] = {5, 4, 3, 2, 1};
mat = &a;
我将代码写为
#include <stdio.h>
int main()
{
int (*mat)[5];
int a[5] = {5, 4, 3, 2, 1};
mat = &a;
printf("%p\n%p\n%d\n", mat, *mat, **mat);
return 0;
}
输出:
43800
43800
5
为什么mat
和*mat
给出相同的答案?
答案 0 :(得分:2)
图片可能会有所帮助:
+---+ +---+
mat: | | ------> a: | 5 | a[0]
+---+ +---+
| 4 | a[1]
+---+
...
+---+
| 1 | a[4]
+---+
因此,我们首先注意到-数组 a
的地址与 array元素 a[0]
的地址相同。 表达式 a
的类型为“ int
的5元素数组”;除非该表达式是sizeof
或一元&
运算符的操作数,否则它将被转换(“衰减”)为类型为“ int
的指针”的表达式,并且该表达式的值expression是数组第一个元素的地址。因此,表达式 &a
,a
和&a[0]
都将产生相同的 value ({的第一个元素的地址{1}}),即使它们并非都是相同的 type (a
,int (*)[5]
,int *
)。
因此,鉴于以上所述,以下所有条件均成立:
int *
由于 mat == &a
*mat == a
**mat == a[0]
和&a
的地址值相同,因此a
和mat
的地址值相同。
答案 1 :(得分:1)
很简单,数组的地址与其第一个元素的地址相同。在这种情况下,myVoid
的类型为*mat
,它会衰减为int[5]
,即指向数组第一个元素的指针。
答案 2 :(得分:0)
mat
是pointer to array 5 of int。
*mat
是int的数组5。。
诸如*mat
之类的数组在传递给函数时会在“ ...中转换为类型为 pointer的类型的表达式,该表达式指向的初始元素
数组对象...”。C11§6.3.2.13
*mat
中的 printf("%p\n",*mat);
是指向int
的指针。
“为什么
mat
和*mat
给出相同的答案?”
这两个都指向相同的存储位置。 mat
指向数组。在printf()
中,*mat
指向第一个数组元素int
。
mat
和*mat
作为指针指向非常不同的类型。他们可以使用不同的表示形式(甚至大小)并产生不同的 text 输出,但它们的值是等效的。这种差异并不常见。
此外,"%p"
期望void*
。使用void*
类型转换获取可移植代码。
printf("%p\n%p\n",mat,*mat); // undefined behavior
printf("%p\n%p\n",(void*) mat,(void*) *mat);