如何将 2D 数组传递和返回给函数

How to pass and return 2d array to a function

本文关键字:返回 函数 2D 数组      更新时间:2023-10-16

我正在尝试更改不同函数中的 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;
}

(如果允许修改原始矩阵,则使其无效(