如何在C+中仅将矩阵的一个维度分配给简单数组+; 为什么我不能在C++中做这样的事情?(与JavaScript或PHP不同)

如何在C+中仅将矩阵的一个维度分配给简单数组+; 为什么我不能在C++中做这样的事情?(与JavaScript或PHP不同),c++,arrays,matrix,multidimensional-array,C++,Arrays,Matrix,Multidimensional Array,我希望ar包含矩阵[0][0],矩阵[0][1]…矩阵[0][100]。相反,它只是返回一个内存地址。 为什么这不能工作(C++的确切特征是什么,有什么缺点/优点吗?),我如何复制这个行为或者至少是相同的任务。(无需循环和复制)C++赋值(operator=)按值工作,其他语言(如php和javascript)按引用赋值 为了做你想做的事情,你需要使用指针: int matrix[100][100]; // As a pointer, this can be seen as int ** int

我希望
ar
包含
矩阵[0][0]
矩阵[0][1]
矩阵[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];

从数组中删除一个扩展数据块时,会留下一个间接寻址或指针

因此:

会有用的

矩阵[x][y]->是一个整数

矩阵[x]->是指向int的指针(或者可以说是从该地址开始的int数组)

您还可以初始化ar以从矩阵中的任何位置开始:

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

ar
具有类型
int[100]
。在任何表达式中(除了ar的大小
&ar
),它都将衰减为
int*
。而
矩阵
将衰减为
int(*)[100]
。所以,不能只分配这些指针

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

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

int arr[10]{};
std::cout << (int)arr << "\t" << &arr << "\n"; // 0x0001bfcd 0x0001bfcd 
std::cout << (int)arr[0] << "\t" << &arr[0] << "\n"; // 0 0x0001bfcd 
int-arr[10]{};
标准::cout
为什么我不能在C++中做这样的事情?< /P>

因为你实际上没有使用任何C++特性。您应该使用为您提供复制语义的:

std::array<std::array<int, 100>, 100> matrix;
auto ar = matrix[0];
std::数组矩阵;
自动ar=矩阵[0];

不过,您应该知道,这将生成一个副本。如果只想访问特定数组,可以使用常量/非常量引用:

std::array<std::array<int, 100>, 100> matrix;
const auto& ar = matrix[0];
std::数组矩阵;
常数auto&ar=矩阵[0];
相反,它只返回一个内存地址

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

ar = matrix[0]
应该会在“分配中的不兼容类型”行中出现编译错误

为什么这个不行

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

如果要处理矩阵中的特定“行”,如第0行,可以这样做

int *ar;
ar = matrix[0];
然后使用下标语法访问数组中的特定单元格

ar[50] = 42; // same as matrix[0][50] = 42
(无需循环和复制)


数组的副本需要循环。

它不是副本。我知道如何在C++中使用数组,我不知道如何在这种情况下使用它们。我不知道如何在这种特定的语言中正确地使用它们。所以你刚才说的是胡说八道。此外,我没有问“如何在C++中使用数组”,所以这不能重复这个问题。又是胡说八道。所以,你在这种情况下所说的一切都是无效的。现在,请在用更多的废话来拍摄之前离开这个主题。如果你知道如何在C++中使用数组,你会知道这个问题的答案,所以这两个问题本质上是相同的。问题是你不知道如何在C++中使用数组。还是一辆车?还是电脑?是的。你也知道如何使用它们。但在某个时候,理解其中一个事物的核心概念的问题干扰了你,你不得不寻求帮助。你不必为了知道如何使用踏板而知道如何制造蝙蝠车。故事结束了。@AndreiPham,很抱歉误解了。我的意思是,你可能知道如何使用其他语言中的数组,但是你不知道C++中的数组(它们和大多数语言不同)。因此,我建议你看一下我提供的链接问题,它仔细地解释了C++中的数组是什么。但是……?你还应该补充什么?@Jeffrey抱歉,我不明白你的意思。我尽量保持我的答案清晰易懂。我知道,在屋顶下,它不是这样的,但是对于初学者来说,应该这样做。这不是C++中的最佳解决方案。你知道为什么吗?为什么?它占用了更多的内存还是什么?@Jeffrey我不能指出它好吧,我明白了,我必须使用指针。我只是没有意识到矩阵[0]本身就是一个指针,我以为它是一个特定的int数组。我没有投反对票,但有一个问题:这是否保证与矩阵[100][100]具有相同的内存布局?您是否有ref或link?@Andre,“此容器是一个聚合类型,其语义与包含C样式数组T[N]作为其唯一非静态数据成员的结构相同。”
int *ar;
ar = matrix[0];
ar[50] = 42; // same as matrix[0][50] = 42