Функции в языке С. Объявление функции. Оператор return. Прототипы функций. Параметры и аргументы функции, страница 3

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

Функция swap1 () будет выглядеть теперь так:

void swap 1(int *a, int *b)

int tmp = *a;    

*a=*b;  

*b = tmp;

}

Иллюстрацию использования этих двух способов передачи параметров дает следующая программа:

#include <stdio.h>   

/•Пример40*/ 

void swap(int a, int b);           

void swap 1 (int *a, int *b);   

void main( void)                                

int x=5, y=10;

рrintf("Сначала x = %d   у = %d\n", x, y);

108

swap (x, y);

printf("Teперь x= %d   y=%d\n", x, y);

printf("Ничего не изменилось ");

swapl(&x, &y); /* Мы должны передать адреса переменных */

printf("Teпepь x = %d   y=%d\n", x, у);

printf("Значения поменялись ");

return 0;

}

void swap(int a, int b)

{

int tmp=a;

a=b;                                                                                                  i

b=tmp;

}

void swap 1 (int *a, int *b)

{                                                                                                                 '",

int tmp = *a;                                                                                             *

*a = *b; *b = tmp;

}

Результатом работы этой программы будет следующее: вначале х=5, у=10, после х=5, у=10.

Значение переменных х и у изменились, так как переменные были переданы по ссылке. Мы передали функции swapl() адреса переменных х и у. Еще одна особенность состоит в том, что в первом случае мы можем вызвать функцию swap() с указанием конкретных значений аргументов: swap(5, 10);

Вызвать функцию swapl() в виде swapl(&5, &10); нельзя.

Если в качестве аргумента функции используется массив, есть лишь один способ - передача параметра по ссылке. В качестве аргумента функции надо указать адрес начала массива. Сделать это можно следующими тремя способами:

function(int ar[10]);

function(int ar[]);

function(int *ar);

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

В качестве примера рассмотрим сортировку массива, при этом офор мим сортировку в виде функции.

#include <stdio.h>

/* Пример 41. Сортировка массива */

void sort(int arr[], int n);

main()

{

int mass[10]={l, 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"); sort(mass, size);

printf("After sorting: ");

for(i=0;i<10;i++) printf("%d", mass[i]);

return 0;

void sort(int arr[], int n)

/* можно заголовок заменить на void sort(int arr[10],   int n) или void sort(int *arr, int n) */

*' int i, j, tmp;

for(i=0;i<n-l;i++)

for(j=0j<n-i-lj++)

if(arr[j+l]<arr[j]){

tmp=arr[j]; аггф=агг[|+1];

arr[j+l]=tmp;

}

}

Как мы видим, элементы массива mass[] поменяли свои значения.

void bubbleSort(int array[], int col){                   

int temp=0;                              

for (int i=1;  i<col  ;  i++){           

for (int j=0;  j<col-i;  j++){    

if (array [j]>array [j+1]){    

temp=array[j];          

array [j]=array [j+1];   

array [j+1]=temp;

}

}

}

}

Еще одним примером использования массивов в качестве аргументом функции будет умножение двух матриц размером 3x3.

#include <stdio.h>

/* Пример . Умножение матриц ♦/

void multiply (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 (А, В, С);

printii["MaccHB С \n");