指向整数数组的指针

时间:2018-08-08 17:01:54

标签: c pointers

假设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给出相同的答案?

3 个答案:

答案 0 :(得分:2)

图片可能会有所帮助:

     +---+            +---+
mat: |   | ------> a: | 5 | a[0]
     +---+            +---+
                      | 4 | a[1]
                      +---+
                       ...
                      +---+
                      | 1 | a[4]
                      +---+

因此,我们首先注意到-数组 a的地址与 array元素 a[0]的地址相同。 表达式 a的类型为“ int的5元素数组”;除非该表达式是sizeof或一元&运算符的操作数,否则它将被转换(“衰减”)为类型为“ int的指针”的表达式,并且该表达式的值expression是数组第一个元素的地址。因此,表达式 &aa&a[0]都将产生相同的 value ({的第一个元素的地址{1}}),即使它们并非都是相同的 type aint (*)[5]int *)。

因此,鉴于以上所述,以下所有条件均成立:

int *

由于 mat == &a *mat == a **mat == a[0] &a的地址值相同,因此amat的地址值相同。

答案 1 :(得分:1)

很简单,数组的地址与其第一个元素的地址相同。在这种情况下,myVoid的类型为*mat,它会衰减为int[5],即指向数组第一个元素的指针。

答案 2 :(得分:0)

matpointer 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);