为什么我可以在没有参考的情况下操纵动态矩

时间:2015-03-07 10:42:35

标签: c++ arrays pointers reference

让它成为动态分配数组的创建函数:

void create(int *&a, int dim){
    a=new int[dim];
    for(int i=0;i<dim;i++){
    a[i]=i+1;
}

在这里,我需要参考(&)。 现在,我有一个动态分配矩阵的创建函数:

void create(int **&a,/* int**a, */ int lines,int rows){
   ...
}

我看到该引用对于动态分配矩阵创建函数是可选的。为什么呢?

3 个答案:

答案 0 :(得分:1)

如果要分配“外部”数组 - 行,则需要引用。没有它,您只能分配“内部”数组 - 行(如果已经分配了“外部”数组)。所以在你的情况下,参考是强制性的。

void create(int **a, int lines, int rows)
{
    a = new int*[lines]; // passed pointer to 'a' will point to an old address

    for(int i = 0; i < lines; i++)
        a[i] = new int[rows];
}

答案 1 :(得分:0)

如果要修改传递给函数内部函数的指针,需要通过引用传递。

所以不,在您的情况下,引用是可选的。无论你在哪里看到它是可选的,都是错误的。

答案 2 :(得分:0)

我的坏。对不起 我看到assignValues函数中的refference是不必要的,所以我认为创建函数也是不必要的。 谢谢大家的回复。 我再次抱歉。 这是我的代码:

#include <iostream>
#include <conio.h>
using namespace std;

void create(int **&a, int lines, int rows){
    int i;
    a = new int*[lines];

    for (i = 0; i < lines; i++){
        a[i] = new int[rows];
    }
}
void assignValues(int **a, int lines, int rows){
    int i,j,k = 1;
    for (i = 0; i < lines; i++){
        for (j = 0; j < rows; j++){
            a[i][j] = k;
            k++;
        }
    }
}

void print(int **a, int lines, int rows){
    int i, j;
    cout << "Matrix is: "<<endl;
    for (i = 0; i < lines; i++){
        for (j = 0; j < rows; j++){
            printf("%3d",a[i][j]);
        }
        cout << endl;
    }
}

int main()
{
    int lines = 5;
    int rows = 4;
    int **a = 0;
    create(a, lines, rows);
    assignValues(a, lines, rows);
    print(a, lines,rows);

    _getch();
    return 0;
}