引用(reference)
c/c++ 中指针的作用基本一样,但是c++增加了另外一种给函数传递地址的途径,就是按照引用传递(pass-by-reference)。
变量名实质是一段连续内存空间的别名,程序通过变量名来申请并命名空间,通过变量名可以使用存储空间。引用可以作为一个已定变量的别名。基本语法:Type &ref=val;& 在这里是起标识作用,而不是取地址。必须在声明引用变量时进行初始化。引用初始化之后不能改变。不能有NULL引用。也可以建立对数组的引用。
int a=10;
int &b=a;
cout <<a <<endl;//10
cout <<b <<endl;//10
//操作b就相当于操作a
b=100;
cout << a << endl;//100
//一个变量可以有多个别名
int &c=a;
//a,b,c地址相同
cout << &a << &b << &c << endl;
//不能改变引用
int &ref=a;
ref = b;//err
给数组取别名
int arr[5]={1,2,3,4,5};
//方式1
int (&my_arr)[5] = arr; //加()的作用是因为[] 优先级比 & 高。 my_arr为数组arr别名
//方式2
typedef int TYPE_ARR[5];
TYPE_ARR &my_arr=arr;
函数参数
int a=1,b=2;
//c++
void swap(int &a,int &b){
int t=a; a=b ; b=t;
}
swap(a,b);
//c
void swap(int *a,int *b){
int temp = *a; *a=*b; *b=temp;
}
swap(&a,&b);
引用作为函数的返回值
int& my_data(){
/*static*/int num=100;
return num;
}
void test(){
int &ret = my_data();
//非法访问内存,num是局部变量函数执行完内存就释放.修改+static
cout << ret;
}
引用本质
引用本质在C++内部是一个指针常量,因此所占空间与指针大小相同。Type& ref=val; 等价于 Type* cosnt ref=&val
int data=10;
int &a=data;
int* const a=&data;
a=11;
指针的引用
//c
void my_str(char **my_str){ // my_str=&str;
my_str = (char *)calloc(1,32);
strcpy(my_str,"hello wrold");
}
char* str=NULL;
my_str(&str);
//c++
void my_str(char* &my_str){ // my_str = str
my_str=(char *)calloc(1,32);
strcpy(my_str,"hello world");
}
my_str(str);
常引用
typedef struct{
int num;
char[20] name;
}STU;
void test(STU tmp){} //tmp开辟独立空间
void test(STU &tmp){} //STU &tmp = lucy,tmp没有开辟独立空间
STU lucy = {100,"lucy"};
test(lucy);