在这个程序中有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
答案 0 :(得分:0)
如果您使用createArray(arr,nrow, ncol)
作为签名来呼叫create_array(int **arr,int nrow, int ncol)
,则arr
功能中不会更新main
。它将保持未定义的值。
即使在C
,您也必须致电createArray(&arr,nrow, ncol)
才能在来电级别更新arr
。 C++
授权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, ...);