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

C++ Array as reference or as pointer

提问人:lapalap 提问时间:9/28/2016 最后编辑:M.Mlapalap 更新时间:9/28/2016 访问量:90

问:

在这个程序中,有 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

C++ 数组 指针 引用 按值传递

评论

1赞 Corristo 9/28/2016
您是否有理由使用可变长度的 C 数组而不仅仅是 std::vector?
2赞 M.M 9/28/2016
此处不使用@Corristo可变长度的 C 数组。 是 C++ 功能new
0赞 Corristo 9/28/2016
哦,确实:D该上床睡觉了。

答:

0赞 Franck 9/28/2016 #1

如果以 sign 调用,则不会在函数中更新。它将保留其未定义的值。createArray(arr,nrow, ncol)create_array(int **arr,int nrow, int ncol)arrmain

即使在中,您也必须打电话才能在呼叫者级别进行更新。 授权 ref 调用以简化读取,但生成的代码与按值传递相同。CcreateArray(&arr,nrow, ncol)arrC++&arr

0赞 πάντα ῥεῖ 9/28/2016 #2

为什么我不能这样写:

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)

除非您想将输出参数设置为 after deleting:nullptr

void clean_memory(int **&arr, int nrow, int ncol) {
    for (int i = 0; i < nrow; ++i) {
        delete[] arr[i];
    }
    delete[] arr;
    arr = nullptr; // <<<<<<<<<<<<<<<<<<<<<
}
0赞 kfsone 9/28/2016 #3
int **arr

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

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

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

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