- •Тема 6. Структуры
- •6.1 Понятие структуры в языке Си
- •6.2 Объявление типа структуры
- •6.3 Декларация переменных структурного типа
- •6.4 Доступ к элементам структурной переменной
- •6.5 Массивы структур
- •6.6 Оператор sizeof
- •6.7 Декларация typedef
- •7.2 Определение функции
- •7.3 Функции, вызывающие, I функции, вызываемые
- •7.4 Связи по данным между функциями
- •7.4.1 Вызов функции
- •7.4.2 Инструкция return (возврат)
- •7.5 Аппарат формальных и фактических аргументов
- •Входные аргументы;
- •Выходные аргументы;
- •Аргументы, которые обновляются.
- •7.6 Прототип функции
- •Тема 8. Передача аргументов функций
- •8.1 Способы передачи аргументов
- •8.1.1 Передача аргументов по значению
- •8.1.2 Передача аргументов по имени
- •8.1.3 Передача аргументов по ссылке
- •8.2 Особенности передачи аргументов в языке Си
- •8.3 Особые случаи передачи аргументов
- •8.3.1 Передача аргументом одномерного массива
- •Пример 6: сумма елеметiв массива (вариант 1).
- •Пример 7: сумма елеметiв массива (вариант 2).
- •8.3.2 Передача аргументом многомерного массива
- •8.3.3 Передача аргументом структуры
- •8.4 Аргументы командной строки
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 , переданный в функцию копией, то его изменение в теле функции допустима.
Чтобы функция, вызываемая, могла изменять переменные в функции, что вызывает, эта переменная должна быть передана по ссылке.
Механизм передачи аргментов массива другой: элементы массива не копируются, так как аргументом передается адрес массива.