无法通过引用正确传递数组

时间:2012-10-02 14:36:39

标签: c++

我正在尝试在一个函数中将我的数组的两行添加到一起并且它没有这样做我不知道为什么它不是代码看起来正确并且不会出错。我试过用*和&通过引用传递它但我总是得到代码错误。感谢

#include <iomanip>
#include <iostream>
#include <fstream>

using namespace std;

void addRow(int arr[100][100], int firstrow,int secondrow,int rows, int cols);

void addRow(int arr[100][100], int firstrow,int secondrow,int rows, int cols){
    int i =0;
    int j = cols;
    while(i<rows){
        arr[secondrow][j]+=arr[firstrow][j];
        i++;
        j++;
    }
    print(arr,rows,cols);
}

3 个答案:

答案 0 :(得分:3)

数组正确传递,你的代码没有正确添加。

您在开始时将j设置为cols,然后使用j++按递增顺序移动它。结果,对数组元素的所有访问都超过了行的末尾。循环退出条件也不正确,除非您的矩阵始终是正方形(在这种情况下,没有必要为行和列传递单独的计数)。

这应该有效:

void addRow(int arr[100][100], int firstrow,int secondrow,int rows, int cols){
    for(int j = 0 ; j != cols ; j++){
        arr[secondrow][j] += arr[firstrow][j];
    }
    print(arr, rows, cols);
}

答案 1 :(得分:3)

void addRow(int (&arr)[100][100], int firstrow,int secondrow,int rows, int cols);
如果你想通过引用传递,

将是正确的签名。

template <typename std::size_t rows, std::size_t cols>
void addRow(int (&arr)[rows][cols], int firstrow,int secondrow);

然后你甚至不需要行&amp; cols作为程序上下文中的参数。

答案 2 :(得分:2)

arr[100][100]更改为arr[][100]。 (实际上,其他一些更改,例如使100成为符号常量,将有助于改进代码的样式,但这是需要进行的主要更改。)

原因并非易懂,但对C ++编程很重要。实际传递给函数addRow()的是 - 请仔细阅读以下内容 - 第一行100个整数的地址。这个地址又是第一个int的地址但是传递的语义就像我说的那样。因此,在addRow()内,符号arr充当指向100个int的数组的常量指针,而不是10,000个int的数组。