引用

163 阅读3分钟

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. 其他类型的引用

  1. 常量引用
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. 引用作为函数参数

  1. 普通函数传递
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的值

  1. 指针传递
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

  1. 引用作为函数参数
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;
}

结果: image 可以看到,a,b的地址和值相同,但是由于a为局部变量,函数结束之后会被释放,所以不要将临时变量作为返回值,可能会使b指向一块非法内存

5. 引用与指针的区别

  1. 引用声明时必须初始化,而指针不需要
1.引用:
  int a = 12;
  int &b = a;
2.指针:
  int a = 12;
  int *p;
  p = &a;
  1. 引用初始化之后不可以指向其他的空间,指针是可以的
  2. 引用更加安全,指针可进行偏移
  3. 指针更加灵活,可以直接操作地址

本文使用 mdnice 排版