- •Лекция 8
- •Основные понятия и определения
- •Основные понятия и определения
- •Основные понятия и определения
- •Виды функций
- •Описание функций
- •Прототип функции
- •Параметры функции
- •Прототип функции
- •Заголовок функции
- •Заголовок функции
- •Тело функции
- •Пример
- •Пример
- •Пример
- •Пример
- •Структура программы
- •Пример
- •Пример
- •Функциональная схема программы
- •Пример
- •Возвращаемое значение функции
- •Пример
- •Пример
- •Возврат значений сложных типов
- •Параметры функции
- •Передача параметров по значению и по ссылке
- •Передача по значению
- •Передача по ссылке
- •Передача по ссылке
- •Пример
- •Пример
- •Массивы как параметры функции
- •Массивы как параметры функции
- •Массивы как параметры функции
- •Массивы как параметры функции
- •Массивы как параметры функции
- •Строки как параметры функции
- •Строки как параметры функции
- •Передача параметров
- •Нижний уровень передачи параметров
Пример
Реализация функции поиска максимального и минимального значения в целочисленном массиве.
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;
}
Передача параметров
В языке С, как и во многих других языках программирования высокого уровня, используется механизм передачи параметров через стек. Т.е. сначала все параметры заносятся в стек, а затем вызывается функция. Существует два метода передачи параметров через стек:
в прямом порядке,
в обратном порядке.