int a =10;
&a; //取地址
int *p = nullptr; 定义指针
*p; 间接引用
int &b = a;
数据类型名 &引用名称 = 被引用的对象; 相当于对引用的变量取别名,定义引用必须初始化
定义完引用后b一直都指向a的那块内存空间,不能改变指向的空间
int a =10;
&a;
int &b = a;
int c = 30;
b = c; //赋值操作,把c的值赋给b指向的空间
解决下面的问题:想要通过函数改变实参的值
void show (int a)
{
a = 50;
cout<<a<<endl;
}
int a = 10;
cout<<a<<endl; 10
show(a); 50
cout<<a<<endl; 10
该函数是值传递不能改变实参,所以此时可以采取两种方案:
一、用指针变成地址传参
void show (int *p)
{
*p = 50;
cout<<*p<<endl;
}
int a = 10;
cout<<a<<endl; //10
show(&a); //50
cout<<a<<endl; //50
二、使用引用
void show (int &a)
{
a = 50;
cout<<a<<endl;
}
int a = 10;
cout<<a<<endl; 10
show(a); 50
cout<<a<<endl; 50
函数传递参数的方式:
1.值传递 实际上是在形参的位置创建了一个新的变量,不能修改函数外面的实参,只能使用。重新创建的形参会占用额外的内存空间(不可控)
2.地址传递 可以修改函数外的实参。会额外占用指针的空间(可控);
3.引用传递 可以修改函数外的实参,不会占用额外的空间
指针和引用的区别:
1.引用一旦定义就要初始化,引用一块真实存在的空间。指针可以不初始化,也可以指向一个空。
2.引用一旦定义完成,不能再引用其他的空间,指针的指向可以随时改变。
3.引用是给一块已经存在的内存空间起别名,不会额外申请空间,指针自己会有一块用来存储地址的空间。