Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Функции и указатели

Читайте также:
  1. A) 3 основных типа функции: определение (задание структуры и описание) данных, обработку данных и управление данными.
  2. B.1 Арифметические функции
  3. B.2 Тригонометрические функции
  4. Cудeбныe функции князя и вeчe
  5. I. Дифференциал функции.
  6. I. Правосознание: понятие, структура, функции и виды.
  7. I. Сущность, формы, функции исторического знания.
  8. II. Правовая культура: понятие, функции и виды.
  9. II. Функции Аппарата Правительства
  10. II. ФУНКЦИИ ОРГАНОВ ВОЕННОГО УПРАВЛЕНИЯ

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

Из главы 5 мы уже узнали, как изменить значения аргументов, передаваемых в функцию, используя ссылки (см. примеры 5.7, 5.8). Однако, поскольку многие программисты С++ используют указатели для изменения значений аргументов, необходимо знать и такой вариант программирования.

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

Рассмотрим, как изменить значения аргументов, передаваемых в функцию, используя указатели:

· для изменения значения аргумента функция должна знать адрес соответствующего аргумента;

· используя операцию адреса (&), программа может передать адрес аргумента в функцию при её вызове;

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

· если функции требуется использовать значение, на которое ссылается (указывает) указатель, функция должна предварять имя параметра-указателя звездочкой, т.е. операцией разыменования (*).

Например, в следующем фрагменте программы параметром функции является указател ь на тип int, а значением аргумента, передаваемого программой в функцию – адрес переменной:

int main() {

int y = 5; fun(&y);

cout<<y<<endl; // 6

}

void fun (int * x){

(*x)++; cout<<*x<<endl; // 6

}

В Примере 7.1. аргументы функции change() передаются по указателю (версия функции change() для случая передачи аргументов по ссылке была рассмотрена в 5- ой главе, Пример 5.7).

// Пример 7.1. Обмен значений двух переменных оформить в виде

// функции. change() Аргументы в функцию передавать по указателю.

#include <iostream>

using namespace std;

void change (int*, int*);

int main() {

int a = 10, b = 5;

change(&a, &b);

cout<<"Posle perestanovki(main): ";

cout<<"a = "<<a<<", b = "<<b<<endl; // a = 5, b = 10

system("pause");

}

void change (int * x, int * y){

cout<< "Do perestanovki(change): ";

cout<<"x = "<<*x<<", y = "<<*y<<endl; // x = 10, y = 5

int z = *x; *x = *y; *y = z;

cout<< "Posle perestanovki(change):\n";

cout<<"x = "<<*x<<", y = "<<*y<<endl; // x = 5, y = 10

}

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

// Пример 7.2. Расположить значения переменных а, в, с в порядке

// возрастания, используя функцию перестановки переменных change().

// Аргументы в функцию передавать по указателю.

#include <iostream>

using namespace std;

void change (int *, int *);

int main() {

int a, b, c;

cout<<"Vvedi a, b, c = "; cin>>a>>b>>c;

if(a > b) change(&a, &b);

if(b > c) change(&b, &c);

if(a > b) change(&a, &b);

cout<<" a = " << a << " b = "<<b<<" c = "<<c<<endl;

system("pause");

}

void change (int * x, int * y){

int temp;

temp = *x; *x = *y; *y = temp;

}

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

Указатель в качестве возвращаемого значения функции

Функции могут не только принимать указатели в качестве аргументов, но и возвращать их.

Чтобы вернуть указатель, функция должна объявить его тип в качестве типа возвращаемого значения. Например, int* fun(); – объявление функции, которая должна вернуть указатель на целое число.

Если функция возвращает указатель, то значение, используемое в её операторе return, также должно быть указателем (как и для всех функций, return -значение должно быть совместимым с типом возвращаемого значения).

// Пример 7.3. Функция возвращает указатель.

// Передача аргументов в функцию по указателю.

#include<iostream>

using namespace std;

int* fun (int*, int*);

int main (){

int a = 2, b = 7, * p;

p = fun (&a, &b);

cout<<*p<<endl;

system("pause");

}

int* fun (int* x, int* y){

if(*x > *y)return x; else return y;

}

// Пример 7.5. Функция возвращает указатель.

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

#include<iostream>

using namespace std;

int* fun (int, int);

int main() {

int a = 2, b = 1, *p;

p = fun(a, b); cout<<*p<<endl;

system("pause");

}

int* fun (int x, int y){

int * t;

if(x > y) t = &x; else t = &y;

return t;

}




Дата добавления: 2015-01-29; просмотров: 41 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.01 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав