实际上可以理解成,是一个变量的别名。使用方法
#includeusing namespace std; int main(void) { int a = 10; int &re = a;//&取地址符,在定义过程中出现,代表引用 re = 100; cout<<"a = "< 结果为a = 100
2、引用的特性(1)、引用声明的时候必须初始化,一经声明,不可改变。
(2)、引用没有定义,是一种关系型声明。类型要与原变量类型保持一致,且不分配内存。与被引用的变量有相同的地址。
(3)、可以对引用,再次引用。多次引用的结果,是某一变量具有多个别名。(大名、小名、昵称)
(4)、&符号前有数据类型的时候,是引用。其他皆为取地址。
3、引用的优点、使用场景:(1)作为函数的入参,修改入参的值,降低入参使用难度。这也是c++加入引用的初衷。
(2)当入参数据很大时,不需要拷贝操作,不耗费资源
#includeusing namespace std; struct student{ int id; char name[64]; }; void change_value(int *input) { *input = 999; } void change_value2(int &input) { input = 1000; } void printS(struct student s) //stu s = s1;结构体整个值拷贝的动作,当结构体数据量大的时候,就比较耗费资源 { cout< id<<" "< name< 输出结果
a = 100
a = 999
a = 1000
10 zhangsan
10 zhangsan
10 zhangsan在工作中比较大的工程时,调试手段经常有打印操作,这个时候使用引用就会比较好,节省资源。但是使用引用时,要注意消息是否需要修改源数据的值。
4、探索引用的本质这一块纯纯的是属于课后思考的问题,其实在日常使用中,就把引用当做是变量的小名就好了。不深究的可以跳过。
我们运行以下的代码
#includeusing namespace std; struct typeA{ int &a; }; struct typeB{ int *a; }; struct student{ int id; char name[64]; }; void motify1(int *const a) { *a = 300; } void motify2(int &a)//当我们将引用作为函数参数传递的时候,编译器会替我们将实参,取地址给引用 { a = 300;//对一个引用操作赋值的时候,编译器替我们隐藏了*操作 } int main(void) { cout<<"sizeof(typeA) = "< 上面的引用所占用的大小,跟指针是相等的。而且使用时必须要求初始化,这似乎跟const常量有点类似。
在这思考:引用的本质是否就是常指针,指针指向常量。指向的内容可以被修改,但是指针的指向不可以被修改。事实上,这一观点已经被许多大佬所验证,如何验证,请移步度娘。
7、常量、常指针、数组名这里再拓展一下,数组名其实也是常指针。
比如int arr[10] = {0};相当于是有十个int变量大小的连续空间,在栈区被开辟了。有一个常指针arr指向这十个int的连续空间的首地址。这样理解的话,其实数组名就是常指针。指针的指向不可改变,但是所指向空间里面的内容可以改变。
其实就等价于int *const arr。数组名和常量、常指针一样都是在常量区,c++根本不会为他们开辟空间。



