Рассмотрим следующий пример, где я пытающийся пройти по ссылке на пути C:Confused на проход по ссылке
// Function prototypes
void increment(unsigned* number);
int main()
{
unsigned* thing;
increment(thing);
cout << *thing;
return 0;
}
void increment(unsigned* number)
{
number = (unsigned*) malloc(sizeof(unsigned));
*number = 1;
}
Я получаю сбой программы на линии cout << *thing
. Да, я использую C++ здесь, но я хотел бы попробовать версию C прохода по ссылке, потому что мой главный проект в С.
Я установил ее, изменив код следующим образом:
// Function prototypes
void increment(unsigned** number);
int main()
{
unsigned* thing;
increment(&thing);
cout << *thing;
return 0;
}
void increment(unsigned** number)
{
*number = (unsigned*) malloc(sizeof(unsigned));
**number = 1;
}
И теперь это работает, и выход 1, как я и ожидал. Однако я не понимаю, почему. Я немного смущен тем, почему наложение дополнительной указатель на вершину решает мою проблему.
Спасибо!
Золотое правило:. Аргументы * всегда * передается по значению. Вы только обновили локальную копию указателя. Он не передавался обратно вызывающему, потому что он был передан по значению, kaboom. Обратите внимание, что в рабочей версии вы не изменили аргумент * number *. Вы изменили число, как и следовало ожидать. –
Я работаю над приложением C++, которое говорит со встроенным C, я думаю, именно поэтому это запутывает. –
C не поддерживает передачу по ссылке. – Olaf