1. 基本数据类型的引用
引用变量,简单来说就是给已经定义的变量起一个别名,两者的用法引用,C语言中使用typedef起别名,但它的为类型起一个别名 示例:
#include <iostream>
using namespace std;
int main()
{
int a = 12;
int& c = a;//c为一个引用变量,即为的别名
c = 15;
cout << "a=" << a << "\n" << "c=" << c << endl;
return 0;
}
输出结果:
a=15
b=15
可以看到,通过c可以改变a的值,a与c的地址相同,指向同一块内存空间
示例:
#include <iostream>
using namespace std;
int main()
{
int a = 12;
int& c = a;
c = 15;
cout << "The address of a=" << &a << "\n" << "The address of c=" << &c <<"\n"<< endl;
cout << "The size of a=" << sizeof(a) << "\n" << "The size of c=" << sizeof(c) << "\n"<<endl;
return 0;
}
结果为:a与c的地址相同,占用空间也相同
The address of a=012FF79
The address of c=012FF79
The size of a=4
The size of c=4
2. 其他类型的引用
- 常量引用
const int &n = 12;
const chr &c = 'c';
const float &f = 123.123f;
2.复合类型的引用
- 数组引用
int array[5] = {0};
int array2[2][3] = {0};
int (&p)[5] = array;
int (&p1)[2][3] = array2;//p1后面一定要加方括号,并且指定大小
p[2] = 1;//操作数组
p1[1][2] = 123;
- 指针的引用
int a =10;
int p3 =&a;
int* &p4 = p3;
*p4 = 19;
3. 引用作为函数参数
- 普通函数传递
void fun(int a)
{
a = 15;
}
int main()
{
int b = 10;
fun(b);
cout<<b<<endl;
}
结果:
10
a并为改变b的值,这是因为b将值10传递给a,但a和b的内存空间不一样,故a不能改变b的值
- 指针传递
void fun(int* a)
{
*a = 15;
}
int main()
{
int b = 10;
fun(&b);
cout<<b<<endl;
}
输出结果:
15
假设b的地址为0x10,值为12,这时将b的地址传给a,a为b的地址,通过*可以改变a所指向的值,故输出结果为15
- 引用作为函数参数
void fun(int& a)
{
a = 15;
}
int main()
{
int b = 10;
fun(b);
cout<<b<<endl;
}
输出结果:
15
可以通过引用a来改变b的值,将b传给引用a后,a与b关联,指向同一块内存空间,故可使用a来改变b的值
4.引用与返回值
int& fun()
{
int a = 12;
cout << &a << endl;
return a;
}
int main()
{
int& b = fun();
cout <<"b="<< b <<" " <<&b << endl;
return 0;
}
结果:
可以看到,a,b的地址和值相同,但是由于a为局部变量,函数结束之后会被释放,所以不要将临时变量作为返回值,可能会使b指向一块非法内存
5. 引用与指针的区别
- 引用声明时必须初始化,而指针不需要
1.引用:
int a = 12;
int &b = a;
2.指针:
int a = 12;
int *p;
p = &a;
- 引用初始化之后不可以指向其他的空间,指针是可以的
- 引用更加安全,指针可进行偏移
- 指针更加灵活,可以直接操作地址
本文使用 mdnice 排版