如何将 2D 数组传递和返回给函数
How to pass and return 2d array to a function
我正在尝试更改不同函数中的 2D 数组值,以便它适合我的需要。对于下面代码中的一个例子,我试图通过将矩阵更改为"1"来将矩阵更改为自反矩阵。
我在返回新数组并将其替换为主程序中的旧数组时遇到问题,以便我可以再次使用它。
int reflexive(int m, int n, int matrix[100][100])
{
for(int i = 1;i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == j)
{
if(matrix[i][j] != 1)
matrix[i][j] = 1;
}
return matrix;
}
}
}
int main()
{
int matrix[100][100];
int m , n;
for(int i = 1;i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
cin>>matrix[i][j];
}
}
matrix[m][n] = reflexive(m,n,matrix);
return 0;
}
我想修复此代码,以便它可以将完整的新 2D 数组返回给主程序。
在你的函数reflexive
return 语句在循环内。这会导致在到达 return 语句时立即终止函数。如果您正确格式化代码,您将能够轻松看到此行为。
进一步注意,数组中的第一个元素的索引为 0,最后一个元素的索引是数组的大小 -1。这是因为数组索引是元素"偏移量"。这意味着
a[i]
和
*(a + i)
访问相同的数组元素。
for(int i = 1;i <= m; i++) // <--- should be for(int i=0; i<m; i++)
{
for(int j = 1; j <= n; j++) // <--- should be for(int j=0; j<n; j++)
{
if(i == j)
{
if(matrix[i][j] != 1)
matrix[i][j] = 1;
}
return matrix; // <--- here the function is terminated
}
}
数组通过指针而不是值传递给函数。这意味着如果函数的形式参数是一个数组,那么并非所有实际参数的值都会复制到数组中。只传递一个指向函数参数值的指针。
因此,在您的情况下,您不需要任何返回值。
以下代码应执行所需的操作:
int reflexive(int m, int n, int matrix[100][100])
{
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
if(i == j)
{
if(matrix[i][j] != 1)
matrix[i][j] = 1; // <----- write to the data by pointer
}
}
}
}
int main()
{
int matrix[100][100];
......
reflexive(m,n,matrix);
......
}
使用
vector<vector<int>>
并通过引用传递它
在这里使用数组既乏味又容易出错。因此:
#include <vector>
std::vector<std::vector<int> > reflexive(std::vector<std::vector<int> > matrix)
{
for(int i = 0; i < matrix.size; i++){
for(int j = 0; j < matrix[i].size; j++){
....
int main()
{
std::vector<std::vector<int> > matrix(100, std::vector<int>(100));
int m , n; //<<whereever they come from I guess? Saw no cin in your code. Have no set value right now.
for(int i = 0; i < m; i++)
{
for(int j =0; j < n; j++)
{
cin>>matrix[i][j];
}
}
}
或
#include<array>
...
std::array<std::array<int, 100>, 100> matrix;
std::array
大小是固定的,std::vector
是动态的。还可以了解std::list
。
无论如何,您应该找到一个讨论它们的基本教程并阅读所有内容。重要标准。
也就是说,特别是如果你想使用动态大小的数组,你不能保证每个子数组的大小都相同(">交错的 2d 数组"(,这在小程序中是可以的,但在大局中应该避免,通过使用确保此属性的类。
对于矩阵,一个简单的选择是使用处理矩阵的库,例如特征。
编辑:
如果在某些时候你需要上面的代码:
std::vector<std::vector<int> > reflexive(const std::vector<std::vector<int> >& input)
{
std::vector<std::vector<int> > output = input;
....
return output;
}
(如果允许修改原始矩阵,则使其无效(
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数