将数组定义为二维数组

时间:2017-01-22 14:39:31

标签: 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

引用http://cdecl.org/

1.declare comb1作为指向int

的数组3的指针的数组4

2.declare comb2作为指向int

的数组3的数组2的指针的数组4

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

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

2 个答案:

答案 0 :(得分:1)

我假设你想要一个指向二维数组的指针。你的第二个声明是正确的(对于那些数组),但你的初始化器是错误的:ab是数组,而不是指向数组的指针。

修正:

int (*ab[4])[2][3]={&a,&b,&a,&b};

答案 1 :(得分:0)

如果您想使用comb[0][0][0]访问a的第一个元素,comb[1][0][0]访问b的第一个元素,则应使用comb1来自你的问题:

int (*comb[4])[3] = {a, b, a, b};

这可能会令人困惑,因为comb应该包含指向ab的指针,这些指针是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

请注意,没有" 17"在p。

的声明中

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

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*paa都将是相同的内存地址:

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,这是错误的。

可以这样做,如果你绝对想要,就像melpomene所示。但在这种情况下,您需要编写一个额外的指针间接:(*comb[0])[0][0]