首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >指向2d数组的指针的静态2d数组

指向2d数组的指针的静态2d数组
EN

Stack Overflow用户
提问于 2014-09-24 23:59:10
回答 4查看 454关注 0票数 2

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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数组。

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

警告:从不兼容指针类型初始化

使用以下命令:

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

怎么啦?

EN

回答 4

Stack Overflow用户

发布于 2014-09-25 01:39:34

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

类似地,在声明指向2D数组的指针时,可以键入(*parr)[m][n]。因此,将一个2D数组指针数组声明为((*parr)[m][n])[p][q])似乎是合乎逻辑的。但是这里的括号实际上没有任何作用,这个表达式相当于(*parr)[m][n][p][q]。这是一个指向4D数组的数组指针!这就是为什么你会收到编译器警告。

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

编写这样的代码的唯一明智的方法是通过类型防御:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef char arr_t[m][n];

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

Stack Overflow用户

发布于 2014-09-25 00:57:20

我想你要做的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char arr1[m][n] = {{0}};
char arr2[m][n] = {{0}};

typedef char (*some_type)[n];  // type of arr1 and arr2
some_type parr[p][q] = {{arr1, NULL}, {arr2, NULL}};  //array containing arr1 and arr2

然后您可以通过以下方式访问parr

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
printf("%c\n", parr[0][0][0][0]);

它将打印arr1[0][0]

票数 1
EN

Stack Overflow用户

发布于 2014-09-25 01:32:01

在parr声明中,我认为您的意思是使用p和q作为其维度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat test.c
#include <stdio.h>

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

char arr1[m][n] = {{0}};
char arr2[m][n] = {{0}};

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

int main(void)
{
    printf("%d\n", (*parr[0][0])[0][0]);
    return 0;
}

这与GCC的4.8.2编得干净利落:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc -ansi -fsanitize=address -g -pedantic -Wall -Wextra -Wfatal-errors -Wno-unused-parameter -o test test.c
$
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26033421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文