c++引用和指针

引用和指针

什么是引用:

引用是一种取名机制,它可以给变量重新取一新的名字,所以引用也叫别名。

为什么使用引用:

1、跨函数共享变量,把函数的参数设置引用,可以在函数内共享实参变量,并且是否共享实参变量由函数的实现者决定,这种设计给了函数实现者权限,并且给了函数调用者方便。

#include <iostream>
using namespace std;
​
void func(int& dashixiong)
{
    dashixiong = 5678;
    cout << &dashixiong << " " << dashixiong << endl;
​
}
​
int main(int argc,const char* argv[])
{
    int sunlingling = 1234;
    int& dashixiong = sunlingling;
    
    func(sunlingling);
    cout << &sunlingling << " " << sunlingling << endl;
    return 0;
}

2、提高函数的传参效率,默认情况下,函数传参单向值传递,变量有多少个字节就要拷贝多个字节的数据,而传递变量的地址,可以需要拷贝4字节的数据,而使用引用一个都不需要拷贝,它比指针的传参的效率还要高。

#include <iostream>
using namespace std;
​
struct Data
{
    char str[20];
    int num;
    char ch;
};
​
void func(Data& d)
{
​
}
​
int main(int argc,const char* argv[])
{
    Data d;
    for(int i=0; i<200000000; i++)
    {
        func(d);
        d.num++;
    }   
    return 0;
}
使用引用要注意的问题:

引用在定义时必须初始化,所以不可能存在空引用,但可能存在悬空引用,但使用指针可能空指针、野指针,所以使用引用比使用指针安全。

#include <iostream>
using namespace std;
​
int& func(void)
{
    int num = 1234;
    return num;
}
​
int main(int argc,const char* argv[])
{
    /*  
    int& hehe = func();
    cout << hehe << endl;
    */
    int* p = new int(1234);
    cout << *p << endl;
    int& num = *p; 
    delete p;
    cout << num << endl;
    return 0;
}

可以引用常量数据、字面值数据,但需要定义const类型的引用。

int main(int argc,const char* argv[])
{
    const int num = 1234;
    const int& hehe = num;  
    const int& xixi = 56789;
​
    cout << hehe << endl;
    cout << num << endl;
    cout << xixi << endl;
​
    return 0;
}

函数的参数使用引用时,实参变量就有被修改的风险,为了防止实参变量被破坏,可以使用const修改引用。

void func(const int& num)
{   
    num = 23456789;
}
​
int main(int argc,const char* argv[])
{   
    int num = 1234;
    func(num);
    cout << num << endl;
​
    return 0;
}

可以引用一个数组(定义数组的引用),但不能定义引用型的数组。

int main(int argc,const char* argv[])
{
    int arr[5] = {1,2,3,4,5};
    // 可以定义数组指针
    int (*arr1)[5] = &arr;
    // 可以定义指针数组
    int* arr2[5];
    
    // 可以定义数组引用或引用数组
    int (&arr3)[5] = arr;   
​
    // 不可以定义引用型的数组
    int& arr4[5];
​
    return 0;
}

总结:在C++中尽量多使用引用,少使用指针。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值