引用基本用法:
引用是c++对c的重要扩充。在c/c++中指针的作用基本都是一样的,但是c++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference),它也存在于其他一些编程语言中,并不是c++的发明。
基本语法:
Type& ref = val;
注意事项:
- &在此不是求地址运算,而是起标识作用。
- 类型标识符是指目标变量的类型
- 必须在声明引用变量时进行初始化。
- 引用初始化之后不能改变。
- 不能有NULL引用。必须确保引用是和一块合法的存储单元关联。
- 可以建立对数组的引用。
普通变量的引用:
代码如下:
int a = 10;
int &b = a;
b = 100;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
上述代码相当于将 b 的地址也指向 a 的地址,所以 a 、 b 共用一块地址,后面改变b就相当于改变a,后面打印出来a、b都等于 100 。
函数的引用:
最常见看见引用的地方是在函数参数和返回值中。当引用被用作函数参数的时,在函数内对任何引用的修改,将对还函数外的参数产生改变。当然,可以通过传递一个指针来做相同的事情,但引用具有更清晰的语法。
如果从函数中返回一个引用,必须像从函数中返回一个指针一样对待。当函数返回值时,引用关联的内存一定要存在。
代码如下:
int &fun() //引用函数名
{
static int a = 20;
return a;
}
这里必须要用 static 关键字去固定 int a ,因为函数中的变量属于临时变量,在函数调用后会被清理,如果后续在对函数中的变量进行操作,会报错,这里使用 static 关键字去固定 int a,会避免这个问题的出现。
主main函数中:
int &mun = fun();
fun() = 600;
cout << "mun = " << mun << endl;
可以看到函数fun() = 600,可以直接赋值,这是因为&fun后,相当于此时函数相当于是a这个变量,及返回的是变量 a ,而不是 20,所以可以进行直接赋值操作,此时相当于 a = 600,所以后面打印出来的也是600。
数组中使用:
代码如下:
int arr[10];
int(&arr_b)[10] = arr;
for (int i = 0; i < 10;i++)
{
arr[i] = i;
}
for (int i = 0; i < 10; i++)
{
arr_b[i] = i;
}
for (int i = 0; i < 10; i++)
{
cout << "arr = " << arr[i] << endl;
}
for (int i = 0; i < 10; i++)
{
cout << "arr_b = " << arr_b[i] << endl;
}
在执行
int(&arr_b)[10] = arr;
后,相当于把数组的 arr_b的地址也指向了 arr 数组,和普通变量用法一样,所以后面对 arr_b 的操作 和对 arr 的操作结果、效果都一模一样。
指针的引用:
代码如下:
strunct1 stu;
strunct1 *p = &stu;
strunct1 *&sss = p;
(*sss).age = 200;
cout << "age = " << p->age << endl;
我将 strunct1 *类型的 p ,重新用引用的方法定义了一个strunct1 *类型的 sss 指向 p 存在的地址,所以此时我操作 sss 指针 和 操作 p 指针的效果是一样的。
常量引用:
常量引用的定义格式:
const Type& ref = val;
常量引用注意:
- 字面量不能赋给引用,但是可以赋给const引用
- const修饰的引用,不能修改。
代码如下:
const int &num = 10;
cout << "num = " << num << endl;
可以看到,我在 const 后面的常量 进行了 &num = 10;这种操作:
int &num = 10
上面操作是不合法的,但前面加上 const 就可以实现。
引用的本质:
引用的本质在c++内部实现是一个指针常量。
Type& ref = val; // Type* const ref = &val;
c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见。
//发现是引用,转换为 int* const ref = &a;
void testFunc(int& ref){
ref = 100; // ref是引用,转换为*ref = 100
}
int main(){
int a = 10;
int& aRef = a; //自动转换为 int* const aRef = &a;这也能说明引用为什么必须初始化
aRef = 20; //内部发现aRef是引用,自动帮我们转换为: *aRef = 20;
cout << "a:" << a << endl;
cout << "aRef:" << aRef << endl;
testFunc(a);
return EXIT_SUCCESS;
}
标签:10,arr,const,int,C++,引用,ref
From: https://blog.csdn.net/weixin_47378530/article/details/139496940