- •Рецензенты:
- •Лекция 1 Основные понятия языка с
- •Первая программа
- •Переменные языка с
- •Имя переменной
- •Объявление константы
- •Операции языка с
- •Лекция 2 Операторы языка с Условный оператор
- •Оператор switch
- •Циклы Цикл for
- •Циклы while и do-while
- •Оператор безусловного перехода
- •Использование операторов break, continue и goto в циклах
- •Операция условие ?
- •Лекция 3 Массивы
- •Инициализация массивов
- •Массивы символов. Строки
- •Функции для работы со строками
- •Лекция 4 Указатели
- •Объявление указателей
- •Операции над указателями
- •Связь указателей и массивов
- •Массивы указателей
- •Инициализация указателей
- •Лекция 5 Функции языка с
- •Объявление функции
- •Оператор return
- •Прототипы функций
- •Функции c произвольным числом параметров
- •Область действия и область видимости переменной
- •Классы памяти
- •Параметры и аргументы функции
- •Лекция 6 Типы, определяемые пользователями
- •Структура
- •Перечислимый тип
- •Переименование типов-typedef
- •Лекция 7 Модели памяти и препроцессор языка с Модели памяти
- •Препроцессор языка с
- •Директива #define
- •Список рекомендуемой литературы
- •Оглавление
- •Программирование на языках высокого уровня: с
- •428015 Г.Чебоксары, Московский просп., 15
Параметры и аргументы функции
В языке С есть особенность, связанная с тем, что все аргументы функции передаются по значению. При вызове функции в стеке выделяется место для формальных параметров функции. и в это выделенное место заносится значение фактического параметра, то есть значение параметра при вызове функции. Далее функция использует и меняет значения в стеке, при выходе из функции измененные значения параметров теряются.
В языке С вызванная функция не может изменить переменные, указанные в качестве фактических параметров в функции при обращении к ней.
Функция swap(), которая должна менять значения параметров местами, не будет фактически это делать: void swap(int a, int b) { int tmp=a; a=b; b=tmp; }
Если необходимо, функцию можно приспособить для изменения аргументов. Надо передавать в качестве параметра не значение, а адрес переменной, которую нужно изменять, то есть передавать указатель на переменную. Такой прием в языке С будет называться передачей параметра по ссылке. Вызванная функция должна описывать аргумент как ссылку и обращаться к фактической переменной косвенно, через эту ссылку. Если в качестве аргумента берется имя массива, то передаваемое функции значение фактически есть адрес первого элемента массива. Функция swapl() будет выглядеть теперь так:
void swapl (int *a, inl *b)
{ int tmp = *a;
*a=*b;
*b =tmp; }
Иллюстрацию использования этих двух способов передачи параметров дает программа 5.17.
Программа 5.17:
#include <stdio.h>
void swap(int a. int b);
void swap(int *a, int *b);
void main(void)
{int x=5. у=10;
printf(" x = %d у = %d\n", x, у);
swap (x. y):
printf(" result ofswap(int a, int b) x = %d y=%d\n",x, y);
swap(&x, &y):
printf(“result ofswap(int *a, int *b) x = %d y= %d\n", x, y);
}
void swap(int a, int b)
{ int tmp=a;
a=b;
b=tmp: ; }
void swap(int *a, int *b)
{ int tmp = *a;
*a =*b;
*b=tmp, }
Результатом работы этой программы будет вначале х=5, у=10, после х=5, у=10. В этом примере демонстрируется так же уникальная возможность языка C++, называемая перегрузкой функции или имени функции, то есть одно и то же имя можно использовать в программе несколько раз с условием, что определение функций будет отличаться числом или типом параметров функции.
Значения переменных х и у изменились, так как переменные были переданы по ссылке. Адреса переменных х и у переданы функции swap(). Еще одна особенность состоит в том, что в первом случае можно вызвать функцию swap() с указанием конкретных значений аргументов: swap(5,10);
Вызвать функцию swapl() в виде swap(&5, &10); нельзя. Если в качестве аргумента и используется массив, есть лишь один способ - передача параметра по ссылке. В качестве аргумента функции надо указать адрес начала массива. Сделать это можно следующими тремя способами: function(int ar[10]); function(int ar[]); function(int *ar);
Все три способа приведут к одному и тому же результату. Следует помнить, что при передаче в качестве аргумента функции массива возможно появление побочного эффекта, а именно изменение значений элементов массива в результате работы функции.
В качестве примера рассмотрим сортировку массива, при этом оформим сортировку в виде функции.
Программа 5.18:
#include <stdio.h>
void sort(int arr| |. int n);
main()
{ inl mass[10] ={ 1, 3, -5, 7, 9. 0, 22, 4, 6, 8};
int size=10, I;
printf(“ Before sorting: ");
for(i = 0; i<10;I++) printf("%d ", mass[i]);
printf (“\n”;)
...mass,size);
printf (“After sorting: ");
for (i=0; ;i<10:I++) printf("%d ", mass[i]);
return o; }
void sort (int arr [], int n)
void sort(int arr[10], int n) or void sort(int *arr, int n)*/
{ int i, j, tmp;
for (i=0; i<n-1; i++)
for(j=0; j<'n-I- l; j++)
if(arr[j+1]< arr[j]){tmp=arr[j]; arr[j]=arr[j+l]; arr[j+l]=tmp; }
}
Элементы массива mass[] поменяли свои значения. Еще одним примером использования массивов в качестве аргументов функции будет умножение двух матриц размером 3х3.
Программа 5.19:
#include <sidio.h>
Умножение матриц*/
void multply(int U[3][3], int V[3][3], int W[3][3]);
main (void){ int A[3][3]= {0, 1, 2,3,4,5,6,7, 8};
B[3][3]= {1. 2, 3,4.5.6, 7,8,9};
int i,j, C[3][3];
multiply(A.,B,C);
printf(" Массив С \n");
for(i=0; i<3; i++ )printf(" %d %d %d\ n", C[i][0], C[i][l], C[i][2]);
