如何在C++中只将矩阵的一个维度分配给一个简单数组



为什么我不能在C++中做这样的事情?(与JavaScript或PHP不同)

int matrix[100][100], ar[100];
//...reading the matrix...
ar = matrix[0];

我希望ar包含matrix[0][0]matrix[0][1]。。。matrix[0][100]。相反,它只是给我返回一个内存地址。为什么这不起作用(C++没有什么确切的功能,有什么缺点/优点吗?哪一个?)以及我如何复制这种行为或至少复制相同的任务。(无需循环和复制)

C++赋值(operator =)按值工作,其他语言(如php和javascript)按引用赋值。

为了做你想做的事,你需要使用指针:

int matrix[100][100]; // As a pointer, this can be seen as int **
int *row;
row = matrix[0];
int value = row[50];

从数组中删除一个数据块时,只剩下一个间接寻址或指针。

因此:

int matrix[100][100], *ar;
// ... doing stuff ...
ar = matrix[0];

会起作用的。

matrix[x][y]->是一个int

matrix[x]->是一个指向int的指针(也可以说是从该地址开始的int数组)

您也可以初始化ar,使其从矩阵中的任何位置开始:

ar = &matrix[39][22]; //eg.

为什么我不能在C++中做这样的事情?

因为您实际上根本没有使用任何C++功能。您应该使用std::array,它将为您提供复制语义:

std::array<std::array<int, 100>, 100> matrix;
auto ar = matrix[0];

实时示例

不过,您应该意识到,这将是一个副本。如果你只想访问一个特定的数组,你可以使用常量/非常量引用:

std::array<std::array<int, 100>, 100> matrix;
const auto& ar = matrix[0];

实时示例

ar的类型为int[100]。在任何表达式中(除了sizeof ar&ar),它将衰减为int *。并且CCD_ 12将衰减为CCD_。所以,你不能只分配这些指针。

您不能修改它们,但可以获取它们的地址(它将等于数组的地址)。

还有一件事:事实上,这些指针并不总是存在于内存中。衰变数组的地址将等于数组本身的地址和它的第一个元素的地址。

int arr[10]{};
std::cout << (int)arr << "t" << &arr << "n"; // 0x0001bfcd 0x0001bfcd 
std::cout << (int)arr[0] << "t" << &arr[0] << "n"; // 0 0x0001bfcd 

相反,它只返回一个内存地址

这是正确的:matrix[0]是指向100个int数组的指针,而ar是100个int的数组的地址。可以将地址分配给已声明的指针,但不能将已声明或隐式的指针分配给已宣布的地址。实际代码

ar = matrix[0]

应该会在"赋值中的不兼容类型"这行出现编译错误。

为什么这不起作用

你说的工作是什么意思?你想做什么?

如果你想寻址矩阵的一个特定"行",比如#0行,你可以这样做

int *ar;
ar = matrix[0];

然后使用下标语法访问阵列中的特定单元

ar[50] = 42; // same as matrix[0][50] = 42

(无需循环和复制)

数组的副本需要循环。

相关内容

  • 没有找到相关文章

最新更新