Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;数组作为引用或指针_C++_Arrays_Pointers_Reference_Pass By Value - Fatal编程技术网

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

C++ C++;数组作为引用或指针,c++,arrays,pointers,reference,pass-by-value,C++,Arrays,Pointers,Reference,Pass By Value,在这个程序中有两个函数:一个用于创建数组,另一个用于删除数组 #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];

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

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

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


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

如果调用
createArray(arr,nrow,ncol)
并将
创建数组(int**arr,int nrow,int ncol)作为签名,
arr
将不会在
main
功能中更新。它将保留其未定义的值

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

为什么我不能这样写:

void create_array(int **arr,int nrow, int ncol)
void create_array(int **arr,int nrow, int ncol)
你终于想要

int **arr;
要接收在
main()
中的
create\u array()
中分配的值,这就是将其传递给

void create_array(int **&arr,int nrow, int ncol)
作为参考

int **arr = get(...);
get(&arr, ...);
// or opaquely by reference
get(arr, ...);
实际上不需要将其作为参考传递

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; // <<<<<<<<<<<<<<<<<<<<<
}
void clean_内存(int**&arr,int nrow,int ncol){
对于(int i=0;i
void create_array(int **arr,int nrow, int ncol)
void create_array(int **arr,int nrow, int ncol)
你终于想要

int **arr;
要接收在
main()
中的
create\u array()
中分配的值,这就是将其传递给

void create_array(int **&arr,int nrow, int ncol)
作为参考

int **arr = get(...);
get(&arr, ...);
// or opaquely by reference
get(arr, ...);
实际上不需要将其作为参考传递

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; // <<<<<<<<<<<<<<<<<<<<<
}
void clean_内存(int**&arr,int nrow,int ncol){
对于(int i=0;i
如果使用此类型的参数调用函数,它将按值传递,这意味着该函数具有源值的离散本地副本

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

int **arr = get(...);
get(&arr, ...);
// or opaquely by reference
get(arr, ...);
表示整数地址的地址的值

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

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

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

是否有理由使用可变长度C数组而不是仅仅使用STD::vector?@ Cordisto可变长度C数组,这里不使用。<代码> NeX/CODE >是C++特性,实际上是:上床睡觉的时间。是否有理由使用可变长度C数组而不是仅仅使用STD::vector?@ Cordisto可变长度C数组,这里不使用。ODE >新< /COD>是C++的特性,的确是:上床睡觉的时间。