C函数的参数中有取地址符&

一 前言

之前在函数中看到函数的形参中存在取地址符&,一直不知道什么意思。然后又一次碰到了,就把它搞定。

void partition(int a[], int s, int t, int &k) //划分函数
{
    int i, j, x;
    x = a[s]; //取划分元素
    i = s; j = t; //扫描指针初值

    do // 循环地进行划分
    {
        while ( (a[j]>=x) && (i<j) )
            j--; //从右向左扫描
        if (i < j)
            a[i++] = a[j]; // 小元素向左移
        while ( (a[i]<x) && (i<j) )
            i++;
        if (i < j)
            a[j--] = a[i]; // 大元素向右移        
    } while (i < j); //直到指针i和j相等

    a[i] = x; //划分元素就位
    k = i;    
}

二 分析与结论

2.1 结论

当函数形参为int &k时,在函数中对k进行操作,比如说赋值,那么主函数中相应的主对象的值也会跟着改变。
相当于,指针变量,但是不需要加上间接访问符*,直接就是对k本身操作就OK,且与指针变量有区别,相当于一个静态的指针。
害,就是引用嘛。

引用自参考文献[1]
实际上,通过对汇编的分析可以看出:
1)“引用是一个别名”的说法并不准确,实际上实现过程中引用也可以看成是一种指针,实际上引用变量存储的就是引用对象的地址,也要占用内存空间(和指针占用大小不同),只不过C++的标准规定了引用初始化完毕之后,对引用的操作就等于是对实际对象的操作。
2)虽然引用可以看做特殊的指针,对引用的操作会被编译器解释成对地址指向的目标的操作。但和*p这种取指针指向对象的方式不同,这种方式不会开辟临时空间存储指针指向的对象。如果指向对象很大,操作重复数很多,这个差异就会对性能有十分大的影响。
3)引用的本身值,即引用对象的地址不可以像指针变量一样修改,对引用的操作只会解释成对引用对象的操作,可以理解引用变量是一个静态的指针。
对第2条的解释,关于指针操作拷贝副本和引用节省空间的详细解释可以看上面的文章—— C++ 引用 参数传递 机制【强烈推荐】。
————————————————
版权声明:本文为CSDN博主「JayRoxis」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JayRoxis/article/details/73060770

2.2 分析

#include <iostream>
using namespace std;

void testfunc(int &x)
{
    cout << "value x is:" << x << endl;
    cout << "sizeof x is: " << sizeof(x) << endl;
    cout << "sizeof &x is: " << sizeof(&x) << endl;
    x = 1;
    cout << "sizeof &x =1 is: " << sizeof(&x) << endl;
}

int main()
{
    int x = 100;

    int * p = &x;

    cout << "sizeof p is: " << sizeof(p) << endl;
    cout << "sizeof *p is: " << sizeof(*p) << endl;

    testfunc(x);
    cout << "value x is: " << x << endl;
    cout << "sizeof x is: " << sizeof(x) << endl;
    cout << "sizeof &x is: " << sizeof(&x) << endl;

    system("pause");
    return 0;
}

运行结果为:

sizeof p is: 8
sizeof *p is: 4
value x is:100
sizeof x is: 4
sizeof &x is: 8
sizeof &x =1 is: 8
value x is: 1
sizeof x is: 4
sizeof &x is: 8
请按任意键继续. . .

  1. 函数形参中int &x,取的是引用对象的地址,也要占用内存空间(和指针占用大小不同,x其实就是对象本身,&x才是指针所占内容空间)。
  2. 在C++的标准中,规定了引用初始化完毕之后,对引用的操作就等于对实际对象的操作
  3. 引用的应用嘛。安全的指针。

参考文献

[1] JayRoxis. C语言中取地址符&做函数形参?—— 引用的讨论. CSDN博客. 2017.
https://blog.csdn.net/JayRoxis/article/details/73060770

  • 26
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值