C++ 数组作为引用或作为指针
C++ Array as reference or as pointer
在这个程序中有两个函数:一个是创建一个数组,另一个是删除它
#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
也一样
如果您使用 create_array(int **arr,int nrow, int ncol)
作为签名调用 createArray(arr,nrow, ncol)
,arr
将不会在 main
函数中更新。它将保留其未定义的值。
即使在 C
中,您也必须调用 createArray(&arr,nrow, ncol)
才能在调用者级别更新 arr
。 C++
通过 ref 授权调用以简化读取,但生成的代码将与按值传递 &arr
相同。
Why can't i write like this:
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; // <<<<<<<<<<<<<<<<<<<<<
}
int **arr
是一个表示int地址的值,
如果您使用此类型的参数调用函数,它将按值传递,这意味着该函数具有源值的离散本地副本。
由于该函数的目的是为我们提供这种类型的值,因此它需要 return 这样的值,取我们的 dest 变量的地址或取一个引用。
int **arr = get(...);
get(&arr, ...);
// or opaquely by reference
get(arr, ...);
在这个程序中有两个函数:一个是创建一个数组,另一个是删除它
#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
如果您使用 create_array(int **arr,int nrow, int ncol)
作为签名调用 createArray(arr,nrow, ncol)
,arr
将不会在 main
函数中更新。它将保留其未定义的值。
即使在 C
中,您也必须调用 createArray(&arr,nrow, ncol)
才能在调用者级别更新 arr
。 C++
通过 ref 授权调用以简化读取,但生成的代码将与按值传递 &arr
相同。
Why can't i write like this:
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; // <<<<<<<<<<<<<<<<<<<<<
}
int **arr
是一个表示int地址的值,
如果您使用此类型的参数调用函数,它将按值传递,这意味着该函数具有源值的离散本地副本。
由于该函数的目的是为我们提供这种类型的值,因此它需要 return 这样的值,取我们的 dest 变量的地址或取一个引用。
int **arr = get(...);
get(&arr, ...);
// or opaquely by reference
get(arr, ...);