2015-02-12 3 views
1

Какова точка, передающая адрес указателя в качестве параметра? Например:Передача адреса указателя в качестве параметра

int *ptr_one; 
ptr_one = (int *)malloc(sizeof(int)); 

, то функция вызывается в следующем виде:

func(&ptr_one); 

Примечание аргумент функции выглядит следующим образом:

func(int **ptr) 
{ 
...... 
} 
+5

Для одного из многих примеров, когда вы передаете адрес {ничего}, эта функция может изменить {ничего} вызывающего. Эта практика (и ваш код) больше C, чем C++. –

+0

Один типичный пример - когда вы добавляете элемент в список, вам нужно передать его 'head' (указатель) и иметь возможность его модифицировать. Использование одного указателя - очень распространенная ошибка, которая создает множество головных болей. Но путь к использованию - это ссылки на C++, то есть передать указатель по ссылке, например 'func (int * & ptr)' – vsoftco

+0

В современном C++ нам редко нужны указатели, так что передача их (каким бы то ни было способом) с. – MSalters

ответ

2

Если вы хотите изменить сам указатель, вам необходимо передать его либо по ссылке, либо по адресу указателя. НАПРИМЕР,

func(int **ptr) 
{ 
    free(ptr); 

    ptr = new int[2]; //side note: use new instead of malloc in C++ 
         //memory allocated with new is deallocated with 
         //delete 
} 

В C, передавая адрес указателя был единственным способом, которым Вы могли бы выделить или освободить память этого указателя в функции. В C++, однако, обычно лучше передавать по ссылке. Итак, версия вашего кода на C++ будет выглядеть так:

int *ptr = new int; 
func(ptr); 
delete ptr; 

void func(int *&ptr) { 
. 
. 
. 
} 
+0

Мой указатель указывает на список записей, и функция будет постоянно изменять заголовок указателя каждый раз, когда я его вызываю. Я думаю, это то, что вы имели в виду, изменив указатель. правильно ? – Anas

+0

@Anas: Да. Если вы просто перешли в 'head', указатель не изменился бы в вызывающем коде, как раз в функции. – wolfPack88

2

Цель передачи указателя на указатель так что переменная указателя может быть изменена.

Вспомните, из кода C-кода, что параметр может быть изменен путем передачи адреса или указателя на параметр. Если параметр является int, который необходимо изменить, передается указатель на целое число. Аналогично, если параметр указателя будет изменен функцией, он будет передан указателем на указатель (или адрес указателя).

Смежные вопросы