能用引用,绝不用指针
一、引用的初始
1.引用是c++对c的扩展,也存在与其他编程语言,不是c++专有。
2.引用是给已有的变量取个别名。
int num=10;
int &a=num;//此处&不是取地址,而是标明a是引用变量,是num的别名。
3.引用后的a完全等价于num
注意:
1.引用必须初始化。
2.引用一旦初始化 就不能修改
int num=10;
int &a=num;
int data=20;
a=data;//不是data别名为a 而是将data值赋值给a(num)
二、引用作用于数组
1、方式一:直接法
void test02(){
int arr[3]={10,20,30};
int (&my_arr)[3]=arr;
cout<<my_arr[0]<<endl;
}
2、方式二:配合typedef
void test02(){
int arr[3]={10,20,30};
//用typedef 给数组类型 取个别名
//ARR就是一个数组类型(有5个元素 每个元素为int类型)
typedef int ARR[3];
//my_arr就是arr的别名
ARR &my_arr=arr;
cout<<my_arr[0]<<endl;
}
三、引用在函数中的应用
引用作为函数的参数
1.传递参数时相对于指针,不用加&,较为方便
//值传递
void my_swap1(int a,int b)
{
int tmp=a;
a=b;
b=tmp;
}
//指针,地址传递
void my_swap2(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
//引用,方便
void my_swap3(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
void test02(){
int data1=10;
int data2=20;
cout<<"data1= "<<data1<<" data2= "<<data2<<endl;
//my_swap1(data1,data2);
//my_swap2(&data1,&data2);
my_swap3(data1,data2);
cout<<"data1= "<<data1<<" data2= "<<data2<<endl;
}
引用作为函数的返回值
int& my_data(void)
{
static int num=20;
return num;//函数返回啥变量 引用就是该变量的别名
//函数的返回值是引用时 不要返回局部变量
}
/*
函数返回值其实就是:
int& mydata()=num;
就是给num取了个别名,然后下面
int &a=my_data();
就是给my_data()取了个别名a,所以a也是num的别名
*/
void test02(){
int &a=my_data();//a是返回变量num的别名
cout<<"a= "<<a<<endl;
}
//当函数返回值作为左值时,则返回类型必须是引用
void test03()
{
my_data()=1000;//相当于把num修改成1000
}
四、引用的本质(仅了解)
int data=10;
int& a=data;//a就是data的别名
//编译器内存转换:int * const a=&data
a=100;//等价于data=100
//编译器内存转换://*a=100
五、指针的引用(仅了解)
#include "stdlib.h"
#include "string.h"
void my_str1(char **p_str)
{
//p_str=&str
*p_str=(char *)calloc(1,32);
strcpy(*p_str,"hello world");
}
void my_str2(char *&my_str)
{
//my_str是str的别名,等价于str
my_str=(char *)calloc(1,32);
strcpy(my_str,"hello world");
}
void test02(){
char *str=NULL;
//需求:封装一个函数 从堆区 给str申请一个空间 并赋值为"hello world"
//my_str1(&str);
my_str2(str);
cout<<"str= "<<str<<endl;
free(str);
}
六、常引用
1.const引用的应用一般在函数的形参上,减少形参与实参的开销,使用const修饰的引用可以保护实参不被修改。
typedef struct
{
int num;
char name[32];
}STU;
void myPrint(const STU &tmp)
{
//strcpy(tmp.name,"nacy");//err tmp有const修饰,不能修改
cout<<"学号:"<<tmp.num<<"名字:"<<tmp.name<<endl;
}
void test02(){
STU lucy={100,"lucy"};
myPrint(lucy);
}
2.常量也可以用引用
const int &num=10;