Передача параметрів в функції за значенням і за посиланням - інтернет підручник c builder

Список параметрів, що передається в функції, як було показано в попередньому розділі, складається з імен параметрів та вказівок на їх тип. Наприклад, в заголовку:

double FSum (double X1, double X2, int A)

вказано три параметра X1, X2, А і визначені їх типи. Виклик такої процедури може мати вигляд:

Це тільки один із способів передачі параметрів в процедуру, званий передачею за значенням. Працює він так. У момент виклику функції в пам'яті створюються тимчасові змінні з іменами X1, Х2, А, і в них копіюються значення аргументів Y, Х2 і константи 5. На цьому зв'язок між аргументами і змінними X1, Х2, А розривається. Ви можете змінювати всередині процедури значення X1, Х2 і А, але це ніяк не відіб'ється на значеннях аргументів. Аргументи при цьому надійно захищені від ненавмисного зміни своїх значень викликаної функцією. Це запобігає випадкові побічні ефекти, які так сильно заважають іноді створення коректного і надійного програмного забезпечення.

int count
int count
int count

void square (int); // Прототип функції обчислення квадрата
void square (int a) // Заголовок функції
a * = a; // Зміна значення параметра
>

Викликатися подібна функція може звичайним способом передачею в неї імені аргументу. наприклад:

int x1 = 2;
square (x1);

В результаті подібного виклику змінна x1 отримає значення 4.

Оскільки посилальні параметри згадуються в тілі викликається функції просто по імені, програміст може ненавмисно прийняти контрольний параметр за параметр, переданий за значенням. Це може привести до неприємних помилок, якщо вихідні значення змінних змінюються викликає функцією.

Наведемо приклад тієї ж розглянутої раніше функції square. але з передачею параметра за посиланням за допомогою покажчика:

void square (int *); // Прототип функції обчислення квадрата
void square (int * а) // Заголовок функції * а * = * а; // Зміна значення параметра
>

Виклик подібної функції може здійснюватися, наприклад, наступним чином:

int x1 = 2;
square (x1);