Це не пропускна посилання, тобто пропускна вартість, як зазначено в інших.
Мова С є без винятку прохідним значенням. Передача покажчика як параметра не означає проходження посилання.
Правило таке:
Функція не в змозі змінити фактичне значення параметрів.
Спробуємо побачити відмінності між скалярними та покажчиковими параметрами функції.
Скалярні змінні
Ця коротка програма показує прохідне значення за допомогою скалярної змінної. param
називається формальним параметром, а variable
виклик функції - фактичним параметром. Зверніть увагу, що збільшення param
функції не змінюється variable
.
#include <stdio.h>
void function(int param) {
printf("I've received value %d\n", param);
param++;
}
int main(void) {
int variable = 111;
function(variable);
printf("variable %d\m", variable);
return 0;
}
Результат -
I've received value 111
variable=111
Ілюзія проходження посилання
Ми трохи змінюємо фрагмент коду. param
зараз вказівник.
#include <stdio.h>
void function2(int *param) {
printf("I've received value %d\n", *param);
(*param)++;
}
int main(void) {
int variable = 111;
function2(&variable);
printf("variable %d\n", variable);
return 0;
}
Результат -
I've received value 111
variable=112
Це змушує вас повірити, що параметр був переданий посиланням. Це не так. Він переданий за значенням, значення параметри - це адреса. Значення типу int було збільшено, і саме цей побічний ефект змушує нас думати, що це був виклик функції проходження посилання.
Покажчики - передані значення
Як ми можемо показати / довести цей факт? Ну, можливо, ми можемо спробувати перший приклад змінних Scalar, але замість скалярних ми використовуємо адреси (покажчики). Подивимось, чи може це допомогти.
#include <stdio.h>
void function2(int *param) {
printf("param's address %d\n", param);
param = NULL;
}
int main(void) {
int variable = 111;
int *ptr = &variable;
function2(ptr);
printf("ptr's address %d\n", ptr);
return 0;
}
Результатом буде те, що дві адреси рівні (не хвилюйтеся про точне значення).
Приклад результату:
param's address -1846583468
ptr's address -1846583468
На мою думку, це чітко доводить, що покажчики передаються за значенням. Інакше ptr
буде NULL
після виклику функції.