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

C++ Array as reference or as pointer

本文关键字:指针 引用 数组 C++      更新时间:2023-10-16

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

#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 也是如此

为什么我不能这样写:

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

你终于想要了

int **arr;

main()中接收在create_array()中分配的值,这就是它被传递给的原因

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; // <<<<<<<<<<<<<<<<<<<<<
}

如果用create_array(int **arr,int nrow, int ncol)作为签名调用createArray(arr,nrow, ncol)arr将不会在main函数中更新。它将保持其未定义的值。

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

int **arr

表示int、地址的地址的值

如果用这种类型的参数调用函数,它会传递值,这意味着该函数具有源值的离散本地副本。

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

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