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

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

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

П р и м е р (+).

/* 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;

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: