2016-09-27 3 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 в качестве ссылки, но мы можем 't передать в качестве указателя (без &)?

Почему я не могу написать так:

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

То же самое относится и к clean_memory

+1

Есть ли причина, по которой вы используете C-массивы переменной длины, а не только std :: vector? – 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) 

как справка.

Это на самом деле не нужно передать в качестве ссылки на

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

Если вы звоните createArray(arr,nrow, ncol) с create_array(int **arr,int nrow, int ncol) в качестве подписи, arr не будет обновляться в функции main. Он сохранит свою неопределенную ценность.

Даже в C вы должны позвонить createArray(&arr,nrow, ncol), чтобы уточнить arr на уровне вызывающего абонента. C++ авторизует вызов ref, чтобы упростить чтение, но сгенерированный код будет таким же, как передача &arr по значению.

0
int **arr 

ли значение, которое представляет адрес - адрес-int,

Если вы вызываете функцию с параметр этого типа, он переходит по значению, то есть функция имеет дискретную локальную копию исходного значения.

Поскольку цель функции - предоставить нам значение этого типа, оно должно либо вернуть такое значение, либо принять адрес нашей переменной dest, либо взять ссылку.

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