C++的引用【C语言从入门到精通系列(十一)】


C语言与C++是两种有共同之处的不同的编程语言c++文件的后缀为.cpp
C++是在C语言的基础上发展而来的,因此C++可以视为C语言的一个超集。

C语言支持的语法C++基本都支持;C++支持的语法C语言不一定支持。


1.C++的引用

为体现C++的引用,先以下边一段C语言代码为例,先理解其功能:

# include <stdio.h>

void modify_num(int *b){
    *b=*b+1;
};

int main(){
    int a=1;
    modify_num(&a);
    printf("after modify_num a=%d",a);
    return 0;
}

输出结果:

after modify_num a=2

该段C语言代码定义了一个modify_num函数该函数的功能是:输入一个指针,然后将该指针位置的变量在原来的基础上加一。经调用,功能正常实现。

使用C++的语法来实现,代码如下:

# include <stdio.h>

void modify_num(int &b){
    b=b+1;
};

int main(){
    int a=1;
    modify_num(a);
    printf("after modify_num a=%d",a);
    return 0;
}

输出结果:

after modify_num a=2


在这段代码中,int& b中的&符号是这里的关键。这里的&符号不表示取地址,而是表示形参b是对原始整数变量的引用。传递引用参数给函数时,函数内部对该引用的修改实际上就是对原始变量的修改。即在modify_num函数中,通过引用参数b的操作会直接影响到函数调用处的实际参数a,因此a的值被成功地增加了1。
如若将此处的&符号去掉,则传入整型变量a,函数modify_num()不会对整型变量a再造成影响。

此即C++的引用。


2.C++引用 与 二级指针

再提供一个案例以加深对C++引用的理解。

void modify_P(int *&p, int *q){
    p=q;
};

int main(){
    int *p=NULL;
    int i=10;
    int *q = &i;
    modify_P(p,q);
    printf("after modify_P *p=%d\n",*p);
    return 0;
}

输出结果:

after modify_P *p=10

在此段代码中,子函数modify_P()的形参处必须加&符号以表引用,若没有此&符号,则会在printf("after modify_P *p=%d\n",*p);处产生异常。异常的原因是,int *p=NULL;并没有真正被改变,而NULL可以理解为空类型,也可以理解为0,表示什么都没有,这样的变量是无法被访问的。因此在printf("after modify_P *p=%d\n",*p);试图访问指针变量p指向的位置,故产生异常。

此外,在形参中,只能写作*&p,而不能写作&*pC++规定,引用符号必须和变量名字紧邻


以上代码如果要转为纯C语言代码,则需要用到二级指针。可以对此做一定的了解。

二级指针,即指向指针的指针。对于变量**p,其二级指针变量为p。试理解下边代码:

# include <stdio.h>

void modify_P(int **p, int *q){
    *p=q;
};

int main(){
    int *p=NULL;
    int i=10;
    int *q = &i;
    modify_P(&p,q);
    printf("after modify_P *p=%d\n",*p);
    return 0;
}

输出:

after modify_P *p=10

如果使用一级指针变量int* p来传递并修改指针p的值,那只会在函数内部产生一个新的指针副本,并不会对外部的指针p产生影响。因此,我们需要使用二级指针int** p来传递指针p的地址,从而在函数内部可以修改指针p的值。

使用二级指针后,只有外边的一层在函数中生成了一个新的指针副本,而内层的指针则在函数外部。

主函数中的p定义的时候,是一个一级指针变量,传入modify_P()的时候则是视为二级指针传入的,这一点是不矛盾的。

在这里插入图片描述


3.C++的布尔类型

C++存在布尔类型,truefalse,对应的值分别为1和0。代码示例如下。

# include <stdio.h>


int main(){
    bool a=true;
    bool b=false;
    printf("a=%d,b=%d\n",a,b);
    return 0;
}

程序输出结果:

a=1,b=0


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值