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

40. Параметры функции. Передача параметров по значению и по адресу.

Механизм параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. Параметры, перечисленные в заголовке описания функции, называются формальными параметрами, или просто параметрами, а записанные в операторе вызова функции – фактическими параметрами, или аргументами.

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

Существует два способа передачи параметров в функцию: по значению и по адресу.

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

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

По умолчанию параметры любого типа, кроме массива и функции, перелаются в функцию по значению.

Пример функции swap, выполняющей обмен значениями между двумя переменными a и b. Если использовать вызов

swap(a, b);

функции, имеющей прототип

void swap(int n, int m);

то переменные a и b сохранят свои первоначальные значения, поскольку swap получает лишь копии значений этих переменных.

Чтобы получить желаемый эффект, надо вызывающей программе передать указатели на те значения, которые должны быть изменены:

swap(&a, &b);

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

void swap(int *pn, int *pm)

{

int temp;

temp = *pn;

*pn = *pm;

*pm = temp;

}

41.Передача массивов в качестве параметров функции

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

Пример функции для подсчета суммы значений элементов массива:

#include <stdio.h>

int func(int *p, int size) //другой вариант заголовка: int func(int p[ ], int size)

{

int s = 0, i;

for(i = 0; i < size; i++)

s += *(p + i);

return s;

}

void main()

{

int mas[] = {1,3,5,7,9};

printf("%d", func(mas, 5));

}

Пример функции, подсчитывающей длину строки:

#include <stdio.h>

int strsize(char *s) //другой вариант заголовка: int strsize(char s[ ])

{

int n = 0;

while(*s != ‘\0’)

{

n++;

s++;

}

return n;

}

void main()

{

char str[] = "!!!2010!!!";

printf("%d", strsize(str));

}

42. Функция main, ее параметры

Функция, которой передается управление после запуска программы, должна иметь имя main. Она может возвращать значение в вызвавшую систему и принимать параметры из внешнего окружения. Возвращаемое значение должно быть целого типа или типа void. Стандарт предусматривает два формата функции.

  1. Без параметров:

тип main( )

{ тело функции}

  1. С двумя параметрами:

тип main(int argc, char *argv[ ])

{ тело функции}

При запуске программы параметры разделяются пробелами. Имена параметров в программе могут быть любыми, но принято использовать argc и argv. Первый параметр (argc) определяет количество параметров, передаваемых функции, включая имя самой программы, второй параметр (argv) является указателем на массив указателей типа char *. Таким образом, каждый элемент массива содержит указатель на отдельный параметр командной строки, хранящийся в виде строки символов, оканчивающейся нуль-символом. Первый элемент массива (argv[0]) ссылается на полное имя запускаемого на выполнение файоа, следующий (argv[1]) указывает на первый параметр, argv[2] – на второй параметр и т.д. Параметр argv[argc] должен быть равен 0.

Если функция main ничего не возвращает или возвращает нулевое значение, вызвавшая система получит значение, означающее успешное завершение. Ненулевое значение означает аварийное завершение. Оператор возврата из main можно опускать.

Пример функции main, которая выводит на экран значения своих параметров:

#include <stdio.h>

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

{

int i;

for(i = 0; i < argc; i++)

printf("%s\n", argv[i]);

return 0;

}

Пусть исполняемый файл программы имеет имя task.exe и вызывается из командной строки:

d:\work\task.exe one two three

На экран будет выведено:

d:\work\task.exe

one

two

three