C++基础入门 – 值传递与引用参数|指针与函数

在函数中修改一个值可以通过指针传值或者引用传址的方式传递

值传递

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的,参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

指针的值传递

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

对指针操作

函数定义

void PointerPinAndFunc_ExchangeLoc(int *p1,int *p2)
{
     int *temp=p1;
     p1=p2;
     p2=temp;
}

 函数调用

    int a=1;
    int b=2;
    int *q1=&a;
    int *q2=&b;
    PointerPinAndFunc_ExchangeLoc(q1,q2);

上面示例中,p1、p2参数是指针变量,函数调用时会创建这两个指针对象,开辟新的空间,其地址与实参的空间地址并不相同,即他们是都是值传递的。所以指针p1、p2的交换并不会影响指针q1、q2。

由此可知,最终结果:

C++基础入门 – 值传递与引用参数|指针与函数

同理下面结果一样。

    int a=1;
    int b=2;
    PointerPinAndFunc(&a,&b);

那我们想要交换值呢?我们如何对形参的指向进行操作?我们看一下下面的示例

 

 

对指针指向操作

void PointerPinAndFunc(int *p1,int *p2);
int main()
{
    // OnlyPointPin();
    // PointPinAndArray();
    int a=1;
    int b=2;
    PointerPinAndFunc(&a,&b);
    cout<<"a:"<<a<<endl;
    cout<<"b:"<<b<<endl;
    system("pause");
    return 0;
}
//note 指针和函数
void PointerPinAndFunc(int *p1,int *p2)
{
     int temp=*p1;
     *p1=*p2;
     *p2=temp;
}

注意:大家容易把*p与p混淆,注意指针概念。C++语言入门-指针

 

如果写成这样,得出的结果是完全不一样的,我们的目的是对a与b的内存进行操作,需要用*p解引用来交换a、b的值,而不是交换指针变量的值(所指向的地址)。

错误示例:

void PointerPinAndFunc_ExchangeLoc(int *p1,int *p2);
int main()
{
    // OnlyPointPin();
    // PointPinAndArray();
    int a=1;
    int b=2;
    PointerPinAndFunc_ExchangeLoc(&a,&b);
    cout<<"a:"<<a<<endl;
    cout<<"b:"<<b<<endl;
    system("pause");
    return 0;
}
//note 交换指针地址
void PointerPinAndFunc_ExchangeLoc(int *p1,int *p2)
{
     int *temp=p1;
     p1=p2;
     p2=temp;
}

除了指针值传递之外,我们还可以通过引用传址的方式,直接对原内存进行操作。

引用参数传址

引用参数传址的方式,实际上与指针*p的操作类似,都是对原内存进行操作。不过引用参数传址不需要指针。它直接通过传递地址来对内存操作,看下示例。

函数定义

//note 交换指针地址
void PointerPinAndFunc_ExchangeLoc_2(int &p1,int &p2)
{
     int temp=p1;
     p1=p2;
     p2=temp;
}

函数调用

    int a=1;
    int b=2;
    int *q1=&a;
    int *q2=&b;
    cout<<"a:"<<a<<endl;
    cout<<"b:"<<b<<endl;
    cout<<"loc(a):"<<&a<<endl;
    cout<<"loc(b):"<<&b<<endl;
    PointerPinAndFunc_ExchangeLoc_2(a,b);
    cout<<"a:"<<a<<endl;
    cout<<"b:"<<b<<endl;
    cout<<"loc(a):"<<&a<<endl;
    cout<<"loc(b):"<<&b<<endl;
    cout<<"q1:"<<*q1<<endl;
    cout<<"q2:"<<*q2<<endl;

 

 

其中p1,p2为引用参数,可以理解为是实参的别名,不进行值传递。函数调用时p1,p2会充当实参别名引用实参,仅只起引用作用。虽然也作为局部变量在栈中开辟了内存空间。其存放的地址就是实参的内存地址,对形参的任何操作都被处理成间接寻址。

在方法中,对p1、p2引用参数的操作就是对实参操作。

由此可知,最终结果为:

C++基础入门 &#8211; 值传递与引用参数|指针与函数

本文所有案例代码:

C++基础入门 &#8211; 值传递与引用参数|指针与函数
来源:诚通网盘 | 提取码:unitymake

 

给TA打赏
共{{data.count}}人
人已打赏
开发

结构体/类/指针里的成员没有正常初始化的问题

2023-9-15 11:16:54

开发

lua系统学习08-Chunk与局部变量

2023-9-15 11:37:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索