C++中的引用和指针

最近在写C++代码的时候,对于函数形参什么时候用&,什么时候用*,比较模棱两可,故总结一下,将相关的知识点巩固一下。

指针

说起指针,我们应该很自然而然的想到地址,指针用*来表示,int *a = &b就表示变量b的地址保存在指针a中,我们也可以说a是指向int的一个指针,a里面储存的是地址,并不是b的值。解引用*符号表示根据地址取值,例如*a表示指针a中储存的地址指向的值,取址符号&表示获得变量的地址,例如&b表示获得变量b的地址。

另外需要说明的是,数组的名称代表的是首元素的地址

1
2
3
4
5
6
int b = 10; //a是变量

//这里其实写法也有两种,*靠近类型还是变量,都是对的,即int* a和int *a,以及int*a都是可以的
int* a = &b; //a就是一个指针,a里面储存的是地址,&b表示取出变量b的地址,整体就是指针a指向变量b

int b[3];//这里声明了一个int类型的数组,变量名b就是一个int*类型的指针,它指向b[0]元素的地址。

引用

引用之前几乎没怎么用过,也没怎么了解过,它更多的是在函数形参传值时回用,这个我们稍后和指针一起来总结。

先看引用变量的代码:

1
2
int a = 3;
int &b = a; //这里的b就是个引用,b和a拥有共同的地址,共同的变量,相当于python中的deepcopy()

指针和引用在函数中的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//func1说明需要给我传递指针,也就是地址
void func1(int* dat1){//something...}
//func2传递的就是普通变量,只不过函数又给传入的变量起了另外一名字
void func2(int &dat2){//something...}
//这里是按值传递,和引用传值作对比
void func3(int dat3){//something...}

int a[3]={0,0,0};//数组
int b=0

func1(a);
func1(&b)//这里是取址,因为func1需要的是地址

func2(b);//这里直接传入变量名,因为函数定义的是引用,而且在func2里面改变dat2的值,b的值也是随之改变

func3(b);//在这个函数里,会生成一个b的副本,也就是dat3,可以这么理解,dat3就是b的完整拷贝

从上述代码的最后两行也能看出来,按值传递和引用传值光从调用上是区分不开的,只能看函数的定义来区分