为什么我不能在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
(无需循环和复制)
数组的副本需要循环。