Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

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

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

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

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

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

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

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

Пример функции 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;

}

 

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

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

#include <stdio.h>

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 n = 0;

while(*s!= ‘’)

{

n++;

s++;

}

return n;

}

void main()

{

char str[] = "!!! year 201X!!!";

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

}

 

<== предыдущая лекция | следующая лекция ==>
Функции в языке С | Функции стандартной библиотеки
Поделиться с друзьями:


Дата добавления: 2014-01-20; Просмотров: 975; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.