如何在C / C ++中获取多维数组的列?
int matrix[9][9],*p; p=matrix[0];
这工作并给出第一行matrix
,但如何得到matrix
第一列我试过p=matrix[][0];
? 另外我不明白为什么下面的代码会出现编译错误?
int matrix[9][9],p[9]; // it looks really ugly, byt why it doesn't work ? p=matrix[0]; // compiler gives "invalid array assigment"
是因为多维数组是数组的数组 – 我们应该将matrix[i][j]
为第i个嵌套数组的第j个元素?
在C / C ++中,多维数组实际上存储为一维数组(在内存中)。 您的2D矩阵存储为具有行优先排序的一维数组。 这就是为什么从列中删除它并不容易,并且默认情况下不提供。 内存中没有连续的数组,您可以获得指向多维数组列的指针。 见下文:
当你执行p=matrix[0]
,你只是得到指向第一个元素matrix[0][0]
的指针,这使你认为你得到了指向第一行的指针。 实际上,它是指向包含matrix
的整个连续数组的指针,如下所示:
matrix[0][0] matrix[0][1] matrix[0][2] . . matrix[1][0] matrix[1][1] matrix[1][2] . . matrix[8][0] matrix[8][1] matrix[8][2] . . matrix[8][8]
如上所示,任何给定列的元素由相应行中的其他元素分隔。
因此,作为旁注,使用指针p
,如果您愿意,可以遍历矩阵的整个81个元素。
您可以使用循环来获取第一列
for(int i = 0; i < 9; i++) { printf("Element %d: %d", i, matrix[i][0]); }
我认为分配不能正常工作,因为你试图为指针分配一些不是地址的东西。
(对不起,这是c代码)
指定matrix[81]
或matrix[9][9]
之间没有区别
matrix[r][c]
简单地表示与matrix[9*r+c]
还有其他容器更适合像boost::multi_array
这样的多维数组
http://www.boost.org/doc/libs/1_53_0/libs/multi_array/doc/index.html
想想裸arrays就像分配一块连续的内存一样。 然后,程序员必须自己处理这段内存。 数组的裸名称,例如matrix
是指向此分配内存块的第一个元素的指针。 那么*(matrix+1)
与matrix[0][1]
或matrix[1]
。
p是int数组,matrix [0]是指针..
matrix
本身是最接近数组列的东西,因为(matrix + 1)[0][0]
与matrix[1][0]
。
如果您希望矩阵连续的位置,请将其声明为一维数组并自行执行行和列计算:
int contiguous_matrix[81]; int& location(int row, int column) { return contiguous_matrix[row * 9 + column]; }
您还可以遍历行的每一列:
typedef void (*Function_Pointer)(int&); void Column_Iteration(Function_Pointer p_func, int row) { row = row * MAXIMUM_COLUMNS; for (unsigned int column = 0; column < 9; ++column) { p_func(contiguous_matrix[row + column]); } }
对于静态声明的数组,您可以像连续的1D数组一样访问它们, p = matrix[0]
将为您提供第1行的第1列。 然后可以像p[i]
, *(p+i)
或p[current_raw * raw_size + current_column)
p[i]
访问1D数组。
如果2D数组用**p
表示,那么事情就会变得棘手,因为它将被解释为指向1D数组的指针数组。