2015-09-04 2 views
0

У меня было задание программирования некоторое время назад, где я наткнулся на эту небольшую проблему: когда я дал функции указатель в качестве параметра, я не мог изменить адрес, на который он указал. Я решил, что, возвращая новый адрес, я хотел, чтобы указатель указывал на него. Но мне все еще интересно, почему невозможно манипулировать параметром указателя, потому что все функции выделения памяти работают с возвращаемым значением, а не с помощью списка параметров.Назначение нового адреса указателю в функции невозможно?

Возможно, я сделал что-то не так? Или действительно невозможно изменить плацдарм? У кого-нибудь есть объяснение?

Пример:

void foo(int *ptr) 
{ 

    ptr=malloc(sizeof(int)); 

} /* after calling this function I would 
expect the pointee to have changed to the 
newly allocate memory but it stays NULL*/ 

int main() 
{ 
    int *ptr=NULL; 
    foo(ptr); 

    return 0; 
} 
+1

Просьба указать код, который иллюстрирует вашу проблему. – sergej

+0

C проходит по значению. – alk

ответ

0

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

Передача указателя на функцию в качестве аргумента - это другая история, , потому что изменение ее не изменит оригинал (перейдите по значению). Это , почему мы используем указатели в этих случаях, чтобы указать адрес переменной и изменить его значение в функции.

Если вам нужно передать указатель вместо этого и изменить его значение, используйте указатель на указатель!

void 
my_function(int **pointer) 
{ 
    *pointer = &something; // will change the pointer address 
} 

int *my_pointer = &something_else; 
my_function(&my_pointer); 
1

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

Если вам нужно сообщить измененный указатель обратно вызывающему абоненту, возвращает измененный указатель - это путь. Обратите внимание, что этот также передает только значение.

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

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