【C++】学习笔记草稿版系列3(引用基础与提高)

# include <iostream>

using namespace std;

int main()
{
    int a = 500;
    // *(int *)0xb0001234 = 500;

    int& ra = a; //ra是a的引用
    printf("sizeof(a) = %d, sizeof(ra)=%d\n", sizeof(a), sizeof(ra));//所占空间大小一样
    printf("&a = %p &ra = %p \n, &a, &ra);//所占内存中的位置一样
}
  1. 一种声明关系,声明的时候必须要初始化。引用不开辟空间。
int &ra; //[ERROR]
  1. 此种声明关系,一经声明,不可变更。
  2. 可以对引用再次引用,多次引用的结果就是多个引用指向同一个变量。
  3. &符号前有数据类型时,是引用。其他均为取地址。

最简易的交换值的代码:

void swap(int *pa, int *pb)
{
    *pa ^= *pb;
    *pb ^= *pa;
    *pa ^= *pb;
}
void swap(int &ra, int &rb)
{
    ra ^= rb;
    rb ^= ra;
    ra ^= rb; 
}//本段代码没有开辟新的空间

引用的本质是对指针的再次包装。指针是由引用的,但是不可以对引用取地址(不可以有引用的指针)。

#include <iostream>

using namespace std;

//void swap(char** p, char** q)//通过向上一级的方式来交换信息,但是这么做不是很好
//{
//    cout<<p<<" "<<q<<endl;
//    char *t = *q;
//    *q = *p;
//    *p = t;
//}

void swap(char* &p, char* &q)//同级的交换,指针的引用
//(平级内解决问题,并且不开辟多余空间)
{
    cout<<p<<" "<<q<<endl;
    char* t = q;
    q = p;
    p = t;
}

int main()
{
    char *p = "difficult";
    char *q = "hope";

    cout<<"p = "<<p<<" q = "<<q<<endl;
    cout<<"p's address is "<<&p<<endl;
//    swap(&p, &q);
    swap(p, q);

    cout<<"p = "<<p<<" q = "<<q<<endl;

    return 0;
}

引用的提高

1. 可以定义指针的引用,但不能定义引用的引用
//[CORRECT]
int * p;
int * & rp = p; 
int ** pp = &p;

//[ERROR]
int a;
int &ra = a;
int & & rra = ra;
//引用希望能在零级内解决问题,从而消除指针的使用
2. 可以定义指针的指针(二级指针),但是不能定义引用的指针
int * & -> 指针的引用,合法
int & * -> 引用的指针,不合法
3. 可以定义指针数组,不能定义引用数组,可以定义数组引用
int x, y, z;
int * p[] = {&x, &y, &z}; //[CORRECT]
int & rp[]={x, y, z}; //[ERROR]rp一般代表首元素的地址, rp代表引用的地址 int & *
int arr[]={1, 2, 3, 4, 5}; //指针的引用 int[5] &
int(&rarr)[5]  = arr;

常引用

const的引用类型也为const
const引用可以使用相关类型的对象(常量,非同类型变量或表达式)初始化。
use const whenever it’s possible

int a = 200;
const double & rd = a; //[CORRECT]类型不匹配,则产生一个中间变量
// double tmp = a; const double & rd = tmp;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值