如何在C/ c++中获得多维数组的列

How to get column of a multidimensional array in C/C++?

本文关键字:数组 c++      更新时间:2023-10-16
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++中,多维数组实际上被存储为一维数组(在内存中)。您的二维矩阵存储为一个一维数组,采用行优先顺序。这就是为什么从中获取一列并不容易,而且不是默认提供的原因。在内存中没有一个连续的数组,你可以得到一个指针指向一个多维数组的列。见下:

当您执行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

可以把裸数组看作是分配一块连续的内存。作为程序员,你必须自己处理这部分内存。数组的名称,例如matrix是指向该分配的内存块的第一个元素的指针。那么*(matrix+1)matrix[0][1]matrix[1]相同

p是整型数组,matrix[0]是指针。

matrix本身是最接近数组列的东西,因为(matrix + 1)[0][0]matrix[1][0]相同。

下面的程序构建一个10x10的数组并输出第二列:

#include <iostream>
using namespace std;
int main()
{
   int aa[10][10];
   for(int i = 0; i<10; i++)
       for(int j = 0; j<10; j++)
           aa[i][j] = i*10+j;
   
   int col = 2;
   // pointer to a length-10 1d array
   int (*p)[10] = (int (*)[10])&(aa[0][col]);
   for(int i =0; i<10; i++)
      cout << *(p[i]) << endl;
   return 0;
}

与aa[row][2]的区别是使用指向长度为10的1d int数组int (*p)[10]的指针,有关int (*p)[10]的更多信息,请参阅答案

p保存1d数组{2, 3, 4, 5, 6, 7, 8, 9, 10, 11}的地址。p+1保存1d数组{12, 13, 14, 15, 16, 17, 18, 19, 20, 21}的地址。*(p[1])*(*(p+1))访问1d数组的第一个值

如果你想让你的矩阵连续的位置,声明它为一个一维数组,并执行自己的行和列计算:

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]将为您提供第一行的第一列。然后可以像p[i]*(p+i)p[current_raw * raw_size + current_column)那样访问1D阵列。

如果用**p表示2D数组,事情就变得棘手了,因为它将被解释为指向1D数组的指针数组。

我不知道这是不是一个有效的解决方案但通过这种方式,我可以得到列

int arr[9][2] = { {2,  57}, {3,  66}, {4,  73}, {5,  76}, {6,  79}, {7,  81}, {8,  90}, {9,  96}, {10, 100}};
int c[18];
int co = 0;
for (auto & i : arr) {
    for (int j : i) {
        c[co++] = j;
    }
}
for (int i = 0; i < co; ++i) {
    if (i % 2 != 0)
        std::cout << c[i] << " ";
}