引用
引用是c++的语法,所以c编译器是不能识别引用的。
int a = 40; int &b = a;
引用的实质:
引用是一个只读的常量,引用在C++中的内部实现是一个常指针。
引用的意义:
作为变量的别名而存在,因此在一些场合可以代替指针
c++编译器中,普通引用会分配空间吗?
struct Teacer { int &a; int &b; }; sizeof(sttuct Teacer) = 8;
由于引用的实质是常指针,所以它需要占用内存,那么怎么解释下吗的语法?
Teacer a; Teacer &b = a; b.num = 10; //实际上编译器处理为(*b).num = 10; void fun(Teacer& k) { ...; } void main() { Teacer t; fun(t); /*此处,相当于 const Teacer* k=&t;只不过这是编译器帮你完成的*/ }
引用当左值:
int& fun() { int a = 20; return a; } void main() { int a1 = fun(); int &a2 = fun(); printf("%d,%d\n",a1,a2); }
函数返回类型为引用,在执行return语句,编译器自动在return的变量前加取值符号,即 return &a;在调用函数处编译器将创建一个临时副本空间——*p。const int *p = &a
int a1 =fun() ==> int a1 = *p =*(&a);所以这里的a1空间的值为20。
int &a2 = *p = *(&a); 但是这里需要注意,a2是一个指针,它指向的空间被赋值为了20,这点是成立的,不过在执行完这句函数调用之后(分号结束一个语句)临时空间被释放了,那么a2指向的空间也被释放了,所以a2(实际上是*a2)就是一个垃圾值了。
为了验证返回类型为引用的函数,会在生成的临时空间上加*号
int fun_1() { int a = 20; return a; } int& fun_2() { static int a = 20; return a; } void main() { fun_1() = 100; //编译不成立,函数返回一个值 fun_2() = 40; //编译成立,*(&a)=40;函数返回变量——*(&a) }
函数作为左值,那么函数返回值类型必须是引用。
指针的引用:
int fun(teacher* &myp) { myp =(teacher*)malloc(sizeof(teacher)); myp->age = 34; return 0; } void main() { teacher* p =NULL; fun(p); printf("age::%d \n",p->age); }
这里的teacher* &myp就是指针引用的定义,调用函数时,就相当于 teacher* &myp = p;在理解上就是相当于为p取别名myp一样。实际上使用引用时,编译器会为我们自动添加*,所以实际函数如下情况:
int fun(teacher** myp) { *myp =(teacher*)malloc(sizeof(teacher)); *myp->age = 34; return 0; }
常引用:
int b = 10; const int &a = b; //表示说,不能再用a去修改b变量的值了
int &c = 10; //编译不通过 const int &d = 10; //编译通过
内在的趣味,表面的繁琐

浙公网安备 33010602011771号