如何在C/C++中获取多维数组的列?

qcbq4gxm  于 2022-12-20  发布在  C/C++
关注(0)|答案(9)|浏览(233)
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个元素吗?

zazmityj

zazmityj1#

在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个元素。

arknldoa

arknldoa2#

您可以使用如下循环获取第一列

for(int i = 0; i < 9; i++)
{
    printf("Element %d: %d", i, matrix[i][0]);
}

我认为赋值运算没有正常工作,因为你试图给指针赋值,而不是地址。
(对不起,这是c代码)

fykwrbwg

fykwrbwg3#

指定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]相同。

neskvpey

neskvpey4#

p为int数组,matrix[0]为指针。

cclgggtu

cclgggtu5#

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

bjg7j2ky

bjg7j2ky6#

如果希望矩阵位于连续位置,请将其声明为一维数组,并自行执行行和列计算:

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]);
  }
}
o0lyfsai

o0lyfsai7#

对于静态声明的数组,你可以像访问连续的一维数组一样访问它们,p = matrix[0]将给予你第一行的第一列,然后一维数组可以像p[i]*(p+i),或p[current_raw * raw_size + current_column)一样访问。
如果用**p表示2D数组,事情就变得棘手了,因为它将被解释为指向1D数组的指针数组。

ebdffaop

ebdffaop8#

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

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] << " ";
}
oogrdqng

oogrdqng9#

#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;
}

数组地址和指向多维数组的指针

相关问题