如何在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数组的指针数组。