首页 > 解决方案 > 指向一维数组还是二维数组的指针变量?

问题描述

我有以下代码用于一维数组:

#include <stdio.h>
int main()
{
    static int b[4] = {11, 12, 13, 14};
    int (*p)[4];

    p = b;
    printf("%d \n", *(p + 1));

    return 0;
}

即使我认为“b(数组名)”是指向一维数组的指针,我还是得到了一个编译错误

'=': cannot convert from 'int [4]' to 'int (*)[4]'

但是,如果我将 b 数组更改为二维数组“a(数组名称)”,则一切正常。这是否意味着,在“int (*p)[4];”的使用中,“*p”必须表示 a[],如下所示:

static int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
int (*p)[4];
p = a;

因此,“int (*p)[4]”只提供了二维数组行数的灵活性。

对这个问题有任何见解吗?

标签: arrayscpointersmultidimensional-arrayimplicit-conversion

解决方案


数组自然衰减为指向其第一个元素的指针,具体取决于上下文。也就是说,当这种衰减发生时,plainb与 相同&b[0],具有 类型int *。由于pand b(or &b[0]) 的类型不同,您会收到错误消息。

至于a这里也是一样的,它衰减为指向它的第一个元素的指针,即a&a[0]. 但是因为a[0]是一个4元素数组, then&a[0]是一个指向四个元素数组的指针,或者int (*)[4]. 这也是p第二个示例中的类型。


推荐阅读