Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Передача в функцию массивов, не являющихся строками

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

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

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

#include <stdio.h>

void MyFun(int* pa)

{

*pa=100;

}

void main()

{

int a=10;

MyFun(&a);

printf("a=%d", a); // Будет напечатано a=100

}

В этом примере значение переменной a будет изменено, так как в этом случае в стек помещается не копия переменной a, а адрес переменной, при выполнении операции обращение по адресу внутри функции, новое значение будет записано по адресу исходной переменной а и переменная будет изменена. Данный процесс демонстрируется на рисунке 7.2.

  Оперативная память
….. ….. …..   Стек
Переменная a=10, 100
pa - адрес a
*pa=100

 

 


Рисунок 7.2 – Размещение в стеке адреса переменной

 

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

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

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

В языке Си++ появился новый тип – ссылки. В некоторых случаях их удобно использовать вместо указателей в качестве параметров функции, так как ссылка, по сути, является указателем, но к ней не надо применять операцию обращения по адресу («*»). В представленном ниже примере функция также меняет значение параметра.

#include <stdio.h>

void MyFun(int& la) // Параметр функции - ссылка

{

la=100; // Не нужно применять операцию – обращение по адресу

}

void main()

{

int a=10;

MyFun(a); // При вызове не нужно получать адрес

printf("a=%d", a); // Будет напечатано a=100

}

 

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

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

#include <stdio.h>

int GetSum(int *p, int n) // p - указатель на массив, n - число элементов

{

int sum=0; // Начальное значение суммы

int i;

for(i=0; i<n; i++) sum+=p[i]; // Прибавляем к сумме элементы массива

return sum;

 

}

void main()

{

int M[]={1, 2, 3, 4, 5};

int sum=GetSum(M, 5); // Вызов функции

printf("sum=%d", sum); // sum=15

}

 

При передаче массивов в функцию разрешена другая форма записи заголовка функции:

int GetSum(int p[], int n)

 

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


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


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



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




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