русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Передача параметров функций с помощью указателей.


Дата добавления: 2015-06-12; просмотров: 503; Нарушение авторских прав


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

В следующем примере для повторения и сравнения приведены все три способа передачи параметров.

П р и м е р (+).

/* 1) В первой функции MyMax1 рассматривается передача параметров с помощью указателей. Изменённые значения с их помощью возвращаются из функции в вызвавшую её функцию.Обратим внимание, что в тексте функции для доступа к числам, находящимся в ячейках с адресами x и у, необходимо использовать операцию разадресации. */

void MyMax1 (int* x, int* y)

{ if (*x>*y) { int t; t=*x; *x=*y; *y=t; }

}

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

void MyMax2 (int &x, int &y)

{ if (x>y) { int t; t=x; x=y; y=t; }

}

/* 3) При передаче параметров по значению (повторение) изменённые значения не возвращаются из функции в вызвавшую её функцию. */

void MyMax3 (int x, int y)

{ if (x>y) { int t; t=x; x=y; y=t; }

}

/*Заметим, что в последних двух вариантах в тексте функции никакие операции над указателями (ни *, ни &) не используются.

Вызов функций зависит от того, работаем мы с простыми переменными (не указателями) или с указателями. */

int main()

{

/* В первом варианте вызова функций используем не указатели, а “простые” переменные. */

int a, b; cout<<"Two int numbers"<<endl;

/* Стандартная функция для ввода scanf и “наша” функция MyMax1 в качестве формальных параметров использует указатели. Поэтому в качестве фактических параметров в функцию передаём &a и&b, т. е. адреса переменных a и b. */



scanf("%d %d", &a, &b);

MyMax1(&a, &b);

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

/* Если ввели, например, 5 и 2, то выведем a=2; b=5. Почему? В x передаётся &a — адрес ячейки a. Поэтому a в main и *x в MyMax1 (аналогично b в main и *y в MyMax1) — это одни и те же ячейки памяти, только по-разному называются. */

scanf("%d %d", &a,&b);

MyMax2(a,b);

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

/*Аналогично, если ввели, например, 5 и 2, то выведем a=2; b=5, так как a в main и x в MyMax2 (b в main и y в MyMax3) — это одни и те же ячейки памяти, только по-разному называются. */

scanf("%d %d", &a,&b);

MyMax3(a,b);

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

/* Здесь a и b не изменились после выполнения функции независимо от их значений, так как a в main и x в MyMax3 (b и y) — это разные ячейки памяти. */

/* Во втором варианте используем указатели, значения которых инициализируем двумя способами. */

int *p1=&a, *p2=new int; //Операцию new смотри в следующем параграфе.

/* Так как функции scanf и MyMax1 требуют, чтобы были переданы адреса, то операция разадресации не используется. В противном случае с этой операцией получили бы не адрес. А поскольку, кроме этого, переменные объявлены как указатели, то при вызове не используем операцию & (взятие адреса). Переменные p1 и p2 уже являются адресами без этой операции. Поэтому вызов будет следующим*/

scanf ("%d %d",p1,p2);

MyMax1(p1,p2);

/* Наоборот, при работе с ячейками, адреса которых в p1 и в p2, надо не забыть использовать операцию разадресации. Без неё были бы выведены адреса, а не числа, с которыми мы работаем. */

cout<<endl<<"*p1="<<(*p1)<<"; *p2="<<(*p2);

scanf ("%d %d",p1,p2);

/* Так как функции MyMax2 и MyMax3 в качестве параметров адреса не используют, то в качестве фактических параметров должны записать содержимое ячеек p1 и p2, которое получается как результат операции разадресации (*). */

MyMax2(*p1,*p2);

cout<<endl<<"*p1="<<(*p1)<<"; *p2="<<(*p2);

scanf ("%d %d",p1,p2);

MyMax3 (*p1,*p2);

cout<<endl<<"*p1="<<(*p1)<<"; *p2="<<(*p2);

getch(); return 0;

}

 



<== предыдущая лекция | следующая лекция ==>
Инициализация и присваивание указателей | Операция new


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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