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
,而不能写作&*p
。C++规定,引用符号必须和变量名字紧邻。
以上代码如果要转为纯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++
存在布尔类型,true
和false
,对应的值分别为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