gpt4 book ai didi

c - 指向二维数组的静态二维数组

转载 作者:行者123 更新时间:2023-12-02 04:27:17 25 4
gpt4 key购买 nike

是否可以在 C 中静态创建指向二维数组的指针的二维数组,例如:

#define m 4
#define n 4
#define p 2
#define q 2

char arr1[m][n] = {{0}};
char arr2[m][n] = {{0}};
char (*parr[m][n])[p][q] = {{&arr1, 0, &arr2, 0}};

int main() {
return 0;
}

2d 指针数组 parr 很稀疏,其中一些值为 0 (NULL),这就是为什么我一开始就不想使用 4d 数组。

这可以编译,但我收到以下警告:

warning: initialization from incompatible pointer type

使用以下命令:

gcc -Wall -Wextra -pedantic -std=c99 test.c

出了什么问题?

最佳答案

问题是,当你声明指针、数组和数组指针时,[] 优先于 *,除非你添加括号。这就是为什么将数组指针声明为 (*parr)[]而不是*parr[] ,因为后者给出了一个指针数组。

类似地,当声明一个指向二维数组的指针时,您可以输入 (*parr)[m][n] 。因此,二维数组指针数组应该声明为 ((*parr)[m][n])[p][q]) 似乎是合乎逻辑的。 。但这里的外括号实际上什么也没做,该表达式相当于 (*parr)[m][n][p][q] 。这是一个指向 4D 数组的数组指针!这就是您收到编译器警告的原因。

现在您真正想要的是获取指向二维数组的数组指针数组,类似于 char (*parr[p][q])[m][n] 。这看起来相当疯狂,没有人会理解这样的声明。

编写这样的代码的唯一明智的方法是通过 typedef:

typedef char arr_t[m][n];

arr_t arr1 = {{0}};
arr_t arr2 = {{0}};
arr_t* parr[p][q] =
{
{&arr1, 0},
{&arr2, 0}
};

关于c - 指向二维数组的静态二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26033421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com