3
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 个元素吗?

4

8 回答 8

15

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

于 2013-03-06T21:11:58.637 回答
8

您可以使用类似的循环获取第一列

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

我认为分配不能正常工作,因为您试图将不是地址的东西分配给指针。

(对不起,这是c代码)

于 2013-03-06T21:13:02.783 回答
4

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是指向这块已分配内存的第一个元素的指针。然后与or*(matrix+1)相同。matrix[0][1]matrix[1]

于 2013-03-06T21:22:17.420 回答
2

p 是一个 int 数组,matrix[0] 是一个指针..

于 2013-03-06T21:11:13.997 回答
1

matrix它本身是您可以得到的最接近数组列的东西,因为(matrix + 1)[0][0]它与matrix[1][0].

于 2013-03-06T21:13:35.820 回答
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]);
  }
}
于 2013-03-06T21:45:33.853 回答
0

对于静态声明的数组,您可以像连续一维数组一样访问它们,p = matrix[0]这将为您提供第一行的第一列。然后可以像p[i]*(p+i)或一样访问一维数组p[current_raw * raw_size + current_column)

如果用 表示二维数组,事情就会变得棘手,**p因为它将被解释为指向一维数组的指针数组。

于 2017-07-26T08:26:47.593 回答
0

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

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] << " ";
}
于 2021-07-27T07:22:42.807 回答