
实际上可以理解成,是一个变量的别名。使用方法
#include
using 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)当入参数据很大时,不需要拷贝 *** 作,不耗费资源
#include
using 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、探索引用的本质
这一块纯纯的是属于课后思考的问题,其实在日常使用中,就把引用当做是变量的小名就好了。不深究的可以跳过。
我们运行以下的代码
#include
using 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++根本不会为他们开辟空间。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)