繁体   English   中英

在另一个数组 C 中存储和访问二维数组

[英]Storing and Accessing 2D array in another array C

我在 C 中工作。(不是 C++)

我有以下代码(为了问题的目的而简化):

const unsigned char val[2][4] = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
};
const unsigned char** container[2] = 
{ 
    val,
    val
};

print(container[0][0][0]);

我的期望是这会打印 1,但它不会(它打印 0,但我认为这正是在该内存地址处发生的事情)。

我希望这个print(container[0][1][2]); 打印 7. 它也没有。

我的目的是在某处定义一堆二维数组,然后存储所有这些二维数组的任何数组以供其他地方访问。

const unsigned char** container[1]

会给你一个“指向无符号指针的指针”的数组(只有一个元素)。

“指向无符号指针的指针”不能与数组索引一起使用,因为当您只有这样一个指针时,数组维度是未知的。

你想要的大概是:

const unsigned char (*container)[4] =  val;

这使containter成为指向 4 个无符号数组的指针。 现在内维是已知的,因此您可以使用数组索引,例如:

printf("%d\n", container[0][0]);
printf("%d\n", container[1][2]);

编辑

如果你真的想要一个数组,你可以这样做:

const unsigned char valA[2][4] = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
};

const unsigned char valB[2][4] = 
{
    { 11, 12, 13, 14 },
    { 15, 16, 17, 18 },
};

const unsigned char (*container[2])[4] =  {valA, valB};

printf("%d\n", container[0][0][0]);
printf("%d\n", container[0][1][2]);
printf("%d\n", container[1][0][0]);
printf("%d\n", container[1][1][2]);
#include <stdio.h>

const unsigned char val[2][4] = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
};
const unsigned char** container[1] = { val };

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

% gcc val.c      
val.c:8:40: warning: initialization of ‘const unsigned char **’ from incompatible pointer type ‘const unsigned char (*)[4]’ [-Wincompatible-pointer-types]
    8 | const unsigned char** container[1] = { val };
      |                                        ^~~
val.c:8:40: note: (near initialization for ‘container[0]’)

% ./a.out        
[1]    228086 segmentation fault (core dumped)  ./a.out

经过值转换的数组名称成为指向第一个元素的指针。 val的第一个元素是val[0] ,指向它的指针是&val[0]并且它的类型是const unsigned char (*)[4] 二维数组不会专门衰减为双重间接指针。

container的正确声明应该是(此处为 3 个,而不是 1 个指针,以提供示例:

const unsigned char (*container[3])[4] = { val, val, val };

如果有疑问,您可以使用cdecl


大多数时候它可能只是

#include <stdio.h>

const unsigned char val[2][4] = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
};

const unsigned char (*container)[4] = val;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM