Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 6,7,8 базовый Си.docx
Скачиваний:
4
Добавлен:
16.11.2018
Размер:
117.96 Кб
Скачать

8.1.3 Передача аргументов по ссылке

Пример 3: Определить функцию obmen , что поменяет

местами значения своих цiлочисельних аргументов a и b * /

....

Void obmen (int * a, int * b)

{Int r;

r = a;

a = b;

b = r;

}

Так невозможно!

Нужно так:

Void obmen (int * a, int * b)

{Int r;

r = * a;

* A = * b;

* B = r;

}

main ()

{

int x, y;

void obmen (int *, int *);

scanf ("% d,% d", & x, & y);

printf ("x =% dy =% d," x, y);

obmen (& x,% y);

printf ("x =% dy =% d," x, y);

}

_____________________________________________________

аргументы

_____________________________________________________

формальный | фактический

_________________________|___________________________

имя указателя на | адрес скалярной переменной

скалярную | адрес элемента массива

переменную |

_________________________|___________________________

имя указателя на | адрес структуры

структуру |

_________________________|___________________________

имя массива | имя массива

имя указателя | имя указателя

_________________________|___________________________

имя массива символов | имя массива символов

имя буквенных указателя | имя буквенных указателя

| Имя элемента массива

| Массивов символов

| Имя элемента массива

| Буквенных указателей

_________________________|___________________________

Способ передачи по ссылке применяется для передачи исходящих и обновляемых аргументов.

! Количество, типы i порядок размещения формальных и фактических аргументов в списках аргументов должны совпадать.

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

8.2 Особенности передачи аргументов в языке Си

В языке Си все аргументы передаются в функцию по значению : в функцию, которая вызывается, значение ее аргументов передаются во временных переменных ( "копии" ), а не сами аргументы.

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

Пример 4: степень n аргумента x (вариант 1).

INT power1 (int x, int n) / * n> = 0 * /

{Int i, p;

p = 1;

for (i = 1; i <= n; i + +)

p = p * x;

return p;

}

Пример 5: степень n аргумента x (вариант 2).

INT POWER2 (int x, int n)

{Int p;

for (p = 1; n> 0; n -)

p *= x;

return p;

}

Потому что агрумент n , переданный в функцию копией, то его изменение в теле функции допустима.

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

Механизм передачи аргментов массива другой: элементы массива не копируются, так как аргументом передается адрес массива.