如何将2d数组传递给函数

时间:2018-01-13 23:11:45

标签: c++ arrays pointers matrix return

我试图改变不同功能的2D数组值,以满足我的需要。 对于下面代码中的示例,我尝试通过更改为" 1"来尝试将Matrix更改为自反。

我有一个问题是返回新数组并将其替换为主程序中的旧数组,以便我可以再次使用它。

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数组返回给主程序。

3 个答案:

答案 0 :(得分:1)

在函数reflexive中,return语句位于循环内。这会导致在到达return语句时立即终止该函数。如果您正确格式化代码,您将能够轻松地看到此行为。

进一步注意,数组中的第一个元素的索引为0,最后一个元素的索引是数组-1的大小。这是因为数组索引是元素&#34; offset&#34;。这意味着

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);
    ......
}

答案 1 :(得分:0)

使用vector<vector<int>>并通过引用传递

答案 2 :(得分:-2)

在这里使用数组很繁琐且容易出错。因此:

#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

在任何情况下,您都应该找到一个基本的教程来讨论它们并阅读所有内容。重要标准。

也就是说,特别是如果你想使用动态大小的数组,你无法保证每个子数组都具有相同的大小(“a 锯齿状的 2d数组”),这在某种程度上是可以的。一个小程序,但应该通过使用确保此属性的类来避免大局。

对于矩阵,一个简单的选择是使用处理矩阵的库,例如Eigen。

编辑:

如果在某些时候你需要const-correct中的上述代码:

std::vector<std::vector<int> > reflexive(const std::vector<std::vector<int> >& input)
{
    std::vector<std::vector<int> > output = input;
    ....
    return output;
}

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