Указатели как аргументы функций

 

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

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

#include <iostream>

#include <math.h>

#include<iomanip>

using namespace std;

int korny_2D(double ,double ,double ,double *,double *);

int korny_2D(double a,double b,double c,double *px1,double *px2)

{

double d;

d=b*b-4.*a*c;

if(d<0.) return 0;

else

if(d==0.)

{

*px1=*x2=(-b+sqrt(d))/(2.*a);

return 1;

}

else

{

*px1=(-b+sqrt(d))/(2.*a);

*px2=(-b-sqrt(d))/(2.*a);

return 2;

}

}

int main(void)

{

double a,b,c,x1,x2;

int k;

cout<<"Vvedite kooficienty a*x^2+b*x+c+0\n";

cin>>a>>b>>c;

k=korny_2D(a,b,c,&x1,&x2);

cout.setf(ios::showpos);

cout<<a<<"*x^2"<<b<<"*x"<<c<<"=0\n";

switch(k)

{

case 0: cout<<"korney net\n";break;

case 1: cout<<"koren 1=n"<<x1<<"\n";break;

case 2: cout<<"2 korny\n"<<"koren 1="<<x1<<"koren 2="<<x2<<endl; break;

}

return 0;

}

Измениия можно увидеть в выделенных строках.

Ниже показан вывод этого примера (рис. 54).

 

Рис. 54. Результат работы программы с указателем в качестве аргумента функции

 

Описание полученных результатов

Принципиальное отличие этого примера от предыдущей версии заключается в передачи указателей px1 и px2 вместо исходных переменных x1 и x2. Прототип функции теперь специфицирует тип параметра как указатель на double, а в функции main () при вызове функции korny_2D используюся адреса переменных x1 и x2. Схема взаимодействия функций представлены на рис. 55. Результат работы программы показывает, что на этот раз значения x1 и x2 были изменены.

В измененной версии функции korny_2D операторы вычислений x1 и x2 выполняют разыменование указателей, чтобы обратиться к значению, хранящемуся в нем.

 

main()
k=korny_2D( a, b, c, &x1, &x2);
k=korny_2D( 2, 3, -4, &x1, &x2);
Временные копии
a
2
b
3
b
-4
x1
 
x2
 
a
2
b
3
b
-4
*x1
 
*x2
 
return k

Рис. 55. Схема взаимодействия функций