2016-09-27 83 views
1

在这个程序中有2个函数:一个用来建立一个数组,并且另一个将其删除C++数组作为参考或作为指针

#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

+1

是否有一个原因,你使用可变长度的C数组,而不是只是一个std ::向量? – Corristo

+2

@Corristo可变长度C数组在这里不使用。 'new'是一个C++特性 –

+0

哦,确实:D时间去睡觉。 – Corristo

回答

0

为什么我不能这样写:

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

你终于想

int **arr; 

为接收在create_array()main()分配一个值,这就是为什么它通过到

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

作为参考。

它并不真正需要的,除非你想删除后,输出参数设置为nullptr作为参考传递给

void clean_memory(int **&arr, int nrow, int ncol) 

void clean_memory(int **&arr, int nrow, int ncol) { 
    for (int i = 0; i < nrow; ++i) { 
     delete[] arr[i]; 
    } 
    delete[] arr; 
    arr = nullptr; // <<<<<<<<<<<<<<<<<<<<< 
} 
0

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

即使在C中,您必须致电createArray(&arr,nrow, ncol)以更新呼叫者级别的arrC++授权ref通过ref来简化读取,但生成的代码将与按值传递&arr相同。

0
int **arr 

是呈现地址的值 - int的地址,

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

由于函数的目的是为我们提供这种类型的值,它需要返回这样一个值,取得我们的dest变量的地址或作为参考。

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