我有这段代码:
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.declare comb1作为指向int
的数组3的指针的数组42.declare comb2作为指向int
的数组3的数组2的指针的数组4我想将梳子用作3dim数组,其中第一个维度选择[2] [3]的指针,其余的标识元素。
这是通过comb1实现的,是否有可能在声明[2] [3]的内部使用类似的东西。 (就像我试图用comb2做的那样没有成功。最后我想用例如comb2 [0] [0] [0])
答案 0 :(得分:1)
我假设你想要一个指向二维数组的指针。你的第二个声明是正确的(对于那些数组),但你的初始化器是错误的:a
和b
是数组,而不是指向数组的指针。
修正:
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
应该包含指向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
请注意,没有" 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
,*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,这是错误的。
你可以这样做,如果你绝对想要,就像melpomene所示。但在这种情况下,您需要编写一个额外的指针间接:(*comb[0])[0][0]
。