Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SIT.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
349 Кб
Скачать
☆

Параметры и аргументы функции

В языке С есть особенность, связанная с тем, что все аргументы функции передаются по значению. При вызове функции в стеке выделяется место для формальных параметров функции. и в это выделенное место заносится значение фактического параметра, то есть значение параметра при вызове функции. Далее функция использует и меняет значения в стеке, при выходе из функции измененные значения параметров теряются.

В языке С вызванная функция не может изменить переменные, указанные в качестве фактических параметров в функции при обращении к ней.

Функция 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]);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]