Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / lect08.ppt
Скачиваний:
3
Добавлен:
18.02.2023
Размер:
218.62 Кб
Скачать

Пример

Реализация функции поиска максимального и минимального значения в целочисленном массиве.

void GetMinMax(int arr[], int n, int *min, int *max)

{

*min = arr[0]; *max = arr[0]; for(int i=1;i<n;i++){

if(arr[i] > *max) *max = arr[i]; if(arr[i] < *min) *min = arr[i];

}

}

Пример

Использование данной функции продемонстрировано в следующем фрагменте программы:

int main(int argc, char *argv[])

{

int n;

... //Ввод переменной n int array[n];

... //Ввод массива array int maxel, minel;

GetMinMax(array,n,&minel,&maxel); printf(“Минимум массива: %d\n”, minel); printf(“Максимум массива: %d\n”, maxel);

...

}

Массивы как параметры функции

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

void ProcArray(int arr[], int n)

{

for(int i=0;i<n;i++) arr[i]++;

}

int main(int argc, char *argv[])

{

int array[] = {0,1,2,3,4,5,6,7,8,9}; int num = sizeof(array)/sizeof(int);

for(int i=0;i<num;i++) printf("%d ",array[i]); //0 1 2 3 4 5 6 7 8 9 puts("");

ProcArray(array,num);

for(int i=0;i<num;i++) printf("%d ",array[i]); //1 2 3 4 5 6 7 8 9 10 puts("");

return 0;

}

Массивы как параметры функции

Массив можно передавать в параметрах используя синтаксис указателя.

void ProcArray(int *arr, int n)

{

for(int i=0;i<n;i++) arr[i]++;

}

int main(int argc, char *argv[])

{

int array[] = {0,1,2,3,4,5,6,7,8,9}; int num = sizeof(array)/sizeof(int);

for(int i=0;i<num;i++) printf("%d ",array[i]); puts("");

ProcArray(array,num);

for(int i=0;i<num;i++) printf("%d ",array[i]); puts("");

return 0;

}

Массивы как параметры функции

Массив в параметрах функции может быть объявлен как константный. Значения элементов этого массива нельзя изменить внутри этой функции, обратившись к ним через имя этого массива. Но можно через дополнительный не константный указатель, установленный на массив с явным приведением типа.

void ProcArray(const int arr[], int n)

{

for(int i=0;i<n;i++) arr[i]++;

//Ошибка

int *arrptr1 = arr;

//Ошибка

int *arrptr2 = (int *)arr;

//Корректно

for(int i=0;i<n;i++) arrptr2[i]++;

//Корректно

}

Массивы как параметры функции

Передача в параметрах многомерных массивов (две и более размерности) осуществляется иначе.

Неправильно:

void ProcArray(int arr[][], int n, int m)

{

for(int i=0;i<n;i++) for(int j=0;j<m;j++)

arr[i][j]++;

}

Массивы как параметры функции

Правильный способ

void ProcArray(int n, int m, int arr[n][m])

{

for(int i=0;i<n;i++) for(int j=0;j<m;j++)

arr[i][j]++;

}

Строки как параметры функции

Строки в языке С в качестве параметров передаются с использованием синтаксиса указателя на символьный тип.

void ProcString(char *str)

{

for(int i=0;str[i]!=0;i++)

if(islower(str[i])) str[i] = 'A' + (str[i] - 'a');

else if(isupper(str[i])) str[i] = 'a' + (str[i] - 'A');

}

int main(int argc, char *argv[])

{

char string[] = "Hello World!";

puts(string);

//Hello World!

ProcString(string);

 

puts(string);

//hELLO wORLD!

return 0;

 

}

 

 

 

Строки как параметры функции

При передаче в качестве параметра массива строк необходимо использовать способ передачи двумерных массивов. Или возможен следующий вариант:

void ProcString(char *str[], int n)

{

for(int i=0;i<n;i++){ for(int j=0;str[i][j]!=0;j++)

if(islower(str[i][j])) str[i][j] = 'A' + (str[i][j] - 'a');

else if(isupper(str[i][j])) str[i][j] = 'a' + (str[i][j] - 'A');

}

}

int main(int argc, char *argv[])

{

char string[][20] = {"One","Two","Three","Four","Five"}; char *strs[] = {string[0],string[1],string[2],string[3],string[4]}; for(int i=0;i<5;i++) puts(string[i]);

ProcString(strs,5);

for(int i=0;i<5;i++) puts(string[i]); return 0;

}

Передача параметров

В языке С, как и во многих других языках программирования высокого уровня, используется механизм передачи параметров через стек. Т.е. сначала все параметры заносятся в стек, а затем вызывается функция. Существует два метода передачи параметров через стек:

в прямом порядке,

в обратном порядке.

Соседние файлы в папке Лекции