Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将数组定义为二维数组_C - Fatal编程技术网

C 将数组定义为二维数组

C 将数组定义为二维数组,c,C,我有以下代码: int a[2][3]={{1,2},{1,3,4}}; int b[2][3]={{4,6},{22,33,55}}; int (*comb1[4])[3]={a,b,a,b};//works int (*comb2[4])[2][3]={a,b,a,b};//it gives me warning: initialization from incompatible pointer type 引述: 1.将comb1声明为指向int数组3的指针数组4 2.将comb2声明为

我有以下代码:

int a[2][3]={{1,2},{1,3,4}};
int b[2][3]={{4,6},{22,33,55}};

int (*comb1[4])[3]={a,b,a,b};//works
int (*comb2[4])[2][3]={a,b,a,b};//it gives me warning: initialization from incompatible pointer type
引述:

1.将comb1声明为指向int数组3的指针数组4

2.将comb2声明为指向int的数组3的数组2的指针的数组4

我想使用comb作为3dim数组,其中第一个维度选择[2][3]的指针,其余维度标识元素


这是通过comb1实现的,是否可以在声明内部使用[2][3]实现类似的功能。(就像我尝试用comb2做的一样,但没有成功。最后我想使用例如comb2[0][0][0])

我假设您想要一个指向二维数组的指针。您的第二个声明是正确的(对于其中的一个数组),但您的初始值设定项是错误的:
a
b
是数组,而不是指向数组的指针

修正:


如果您想使用
comb[0][0][0]
访问
a
的第一个元素,以及
comb[1][0][0]
访问
b
的第一个元素,您应该从您的问题中使用
comb1

int (*comb[4])[3] = {a, b, a, b};
这可能会让人困惑,因为
comb
应该包含指向
a
b
的指针,它们是2x3矩阵,而不是本声明似乎指出的3个整数的数组。2号不应该在那里的某个地方吗

但是请记住,数组在C中是二级公民,在大多数情况下,它们不是作为实际数组处理的,而是作为指向数组中第一个元素的指针处理的。对于指向数组的指针也是如此。通常,您不使用指向数组的指针,而是使用指向数组第一个元素的指针。地址相同,但数据类型不同。下面是一个更简单的例子:

float a[17]; // This is an array of 17 floats
float *p = a; // This is just a pointer to float, not to array of floats
a[0] = 3.14; // Setting the first element of a
p[0] = 3.14; // Setting the same element, through p
请注意,p的声明中没有“17”

您可以使用指向数组的指针,但需要额外的间接级别,以跟随该指针并获得正确的数据类型:

float (*pa)[17] = &a; // Pointer to array of 17 floats
(*pa)[0] = 3.14; // Setting the first element of a, through pa
您可以编写
pa[0][0]
而不是
(*pa)[0]
,因为C中的
a[0]
相当于
*a
,但这会产生误导,因为这会给人一种存在二维数组的印象,而您所拥有的只是指向一维数组的指针

真正令人困惑的是,在上面的代码中,
pa
*pa
a
都是相同的内存地址:

printf("a = %p\n", (void*)a);
printf("pa = %p\n", (void*)pa);
printf("*pa = %p\n", (void*)(*pa));
在计算机上运行时的输出:

a = 0x7fff875a07e0
pa = 0x7fff875a07e0
*pa = 0x7fff875a07e0
由于数组有点特殊,指向数组的指针也有点特殊。如果
a
是一个数组,则
a
&a
(在大多数上下文中使用时)都提供相同的地址(但数据类型不同)。相反:如果
p
是指向数组的指针,则
p
*p
都给出相同的地址(但数据类型不同)

总而言之:如果您认为由于
a
是2x3矩阵,那么
comb
的声明应该同时表示2和3,而不仅仅是3,这是错误的


你可以这样做,如果你绝对愿意的话,就像梅尔波默尼所展示的那样。但在这种情况下,您需要编写一个额外的间接指针:
(*comb[0])[0][0]

请记住,当您用C编写数组名称时,它(在大多数上下文中)会衰减为指向其第一个元素的指针。那么,在
ab
的定义中用作初始值时,
a
b
的类型是什么?你的意思是在标题中“定义指针”吗?@Thomas:我想用ab[0][0][0]来获得a的第一个元素,用ab[1][0][0]来获得b的第一个元素。这样我应该做ab[0][0][0]访问第一个元素。我想通过ab[0][0][0]@Joe获得它。你的问题不是这样说的。你提出的解决方案创建了一个int[4][16]数组。我想要的是一个结构,它有:指向int[4][16]的指针数组。(现在我读到它似乎是一样的)第一个声明的工作原理与我希望它的工作原理完全一样,但我不确定它为什么会发生。有没有一种方法可以定义这样一个结构,它的行为类似于第一个声明(例如ab[0][0][0]),但包含[2][3]?@Joe“您提出的解决方案创建了一个数组”-没有,我的(或者更确切地说,您的,因为我从您那里得到的)声明创建了一个由4个指针组成的数组。的确,但它们是指向int[2][3]的指针元素我要找的是指向int[2][3]元素的指针
a = 0x7fff875a07e0
pa = 0x7fff875a07e0
*pa = 0x7fff875a07e0