Пропускающий адрес, но он работает как вызов по значению в C?

Привет, я новичок в языке программирования C. Недавно я прочитал о вызове по стоимости и позвонил по адресу. Я узнал, что при вызове по изменению адреса вызываемые функции отражают вызываемого абонента. Однако следующий код не работает.

int x = 10,y = 20; void change_by_add(int *ptr) { ptr = &y; printf("\n Inside change_by_add\t %d",*ptr); // here *ptr is printing 20 } void main(){ int *p; p = &x; change_by_add(p); printf("\nInside main\t %d", *p); // here *p is still pointing to address of x and printing 10 } 

Когда я передаю адрес, то почему изменения, сделанные вызываемой функцией, не отражают вызывающего?

Функция назначает новый адрес указателю, но сам указатель передается по значению, так как все аргументы находятся в C. Чтобы изменить значение переменной указателя, должен быть передан адрес самого указателя:

 void change_by_add(int **ptr) { *ptr = &y; } change_by_add(&p); 

См. C FAQ Вопрос 4.8 .

Передача по ссылке не существует в C, но может быть достигнута путем передачи адреса переменной, значение которой должно быть изменено на функцию. Например:

 void add_to_int(int* a_value, int a_increment) { *a_value += a_increment; } 

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

* ptr = y;

Это дешифрует указатель (отображая указанное значение), поэтому, когда вы используете оператор equals, указанная память изменяется, а не сам указатель. Надеюсь, это поможет прояснить ситуацию.

В C. не существует такой точки, как вызов по адресу. Существует только вызов по значению. То, что делает, когда функция должна изменять аргумент способом, который является видимым для вызывающего, заключается в том, чтобы вызывающий передавал указатель на что-то и вызывал функцию, записывающую обновление, хотя этот указатель. Обратите внимание, что сам указатель по-прежнему отправляется как вызов по значению – то есть: вызываемая функция получает свою собственную копию указателя и может изменить ее, чтобы указать на что-либо еще, если захочет.