C ++数组作为引用或作为指针

时间:2016-09-27 20:34:18

标签: c++ arrays pointers reference pass-by-value

在这个程序中有2个函数:一个用于创建数组,另一个用于删除它

#include "stdafx.h"
#include <iostream>
using namespace std;

void create_array(int **&arr,int nrow, int ncol) {
    arr = new int*[nrow];
    for (int i = 0; i < nrow; ++i){
        arr[i] = new int[ncol];
        }
}

void clean_memory(int **&arr, int nrow, int ncol) {
    for (int i = 0; i < nrow; ++i) {
        delete[] arr[i];
    }
    delete[] arr;
}


int main()
{
    int nrow, ncol,element;
    int **arr;
    printf("Dynamic array \n");
    printf("Write down number of rows and number of columns \n");
    scanf_s("%d %d", &nrow, &ncol);
    create_array(arr,nrow, ncol);
    clean_memory(arr, nrow, ncol);
    cin.get();
    printf("Press Enter to exit \n");
    cin.get();

    return 0;
}

为什么我们将数组作为参考传递给create_array,但我们无法作为指针传递(没有&)?

为什么我不能这样写:

void create_array(int **arr,int nrow, int ncol)

clean_memory

也是如此

3 个答案:

答案 0 :(得分:0)

如果您使用createArray(arr,nrow, ncol)作为签名来呼叫create_array(int **arr,int nrow, int ncol),则arr功能中不会更新main。它将保持未定义的值。

即使在C,您也必须致电createArray(&arr,nrow, ncol)才能在来电级别更新arrC++授权ref调用简化读取,但生成的代码与按值传递&arr相同。

答案 1 :(得分:0)

  

为什么我不能这样写:

void create_array(int **arr,int nrow, int ncol)

你最终想要

int **arr;

接收create_array()main()分配的值,这就是传递给

的原因
void create_array(int **&arr,int nrow, int ncol)

作为参考。

实际上并不需要将

作为参考传递
void clean_memory(int **&arr, int nrow, int ncol)

除非您想在删除后将输出参数设置为nullptr

void clean_memory(int **&arr, int nrow, int ncol) {
    for (int i = 0; i < nrow; ++i) {
        delete[] arr[i];
    }
    delete[] arr;
    arr = nullptr; // <<<<<<<<<<<<<<<<<<<<<
}

答案 2 :(得分:0)

int **arr

是一个值,它表示int的地址地址,

如果使用此类型的参数调用函数,它将按值传递,这意味着该函数具有源值的离散局部副本。

由于函数的目的是为我们提供这种类型的值,它需要返回这样的值,获取dest变量的地址或者参考。

int **arr = get(...);
get(&arr, ...);
// or opaquely by reference
get(arr, ...);