Указатели как аргументы функций
Когда используются указатели в качестве аргументов, механизм передачи по значению работает, как и прежде; однако указатель – это адрес другой переменной, и если взять копию этого адреса, то она будет по-прежнему указывать на ту же переменную. Таким образом, применение указателя в качестве параметра позволяет функции получить сам аргумент, а не его копию.
Для демонстрации эффекта можно изменить последний пример, чтобы он использовал указатель:
#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. Схема взаимодействия функций