跳转至

引用

什么是引用

  • 别名
  • 特殊指针

指针和引用的对比

  • 函数中的引用,用于函数参数和函数返回值
  • 常量引用
  • 指针引用

C语言大量使用指针,比较复杂。

C++可以继续使用指针,有时候可以不用指针,用C++的引用代替指针。不用那么复杂的指针。

引用相当于是变量的别名,特殊的指针。

int y = 12;
int *p = &y;//指针。取y的地址

(*p)++; 通过指针修改了y的值y变为了13

//指针比较复杂,需要写`*`星号。
int &r = y;//引用r和y是同一个变量,对r操作就是对y操作。y和r是同一个变量。r是y的别名。
r++; //

上面一个是(*p)++一个是r++都可以把y的值加1,一个带星号麻烦,一个简单。

引用是用来代替指针,有的情况代替不了。

引用其实也是一个指针,一个特殊的指针。

指针和引用的对比

  • 创建引用时必须初始化 指针可以在任何时候初始化
  • 引用不能改变 指针可以改变
  • 没有NULL引用 有NULL指针
int &r = y;
r = x; //r是y的引用(别名),这一行相当于 y = x;把x值赋给y,y的值和x是相等的。
r++//这里的r++就是y++,y的值等于x,然后再加1.

指针可以指向一个变量,然后改变指向另一个变量。

在一些情况下用引用代替指针,因为指针比较复杂。

引用可以代替指针的情况

函数中的引用,用于函数参数和函数返回值。

按值传递

函数参数默认是按值传递,操作的是参数的复制。拷贝,并不是原来的数据。

void f(int a)
{
    a++;
}
//调用
int x = 6;
f(x);   //x本身的值并不受影响,没有被修改,修改的是复制的。

传指针(引用)

如果是一个大的数据,如果也要复制,需要时间和空间。会慢。

//指针:
int* g(int* a)
{
    (*a)++;
    return a;
}
///调用,调用的时候就要传地址。
g(&x); //原始的数据就被修改了。

也可以把指针替换成引用

//这样写就简单了
int& k(int& a)
{
    a++;
    return a;
}
//调用的时候也简单了,不需要传地址,直接传变量就可以了。
k(x);//x的值被修改了。

传引用,但是再函数内部不对它进行修改。

加上const。传进来的数据只能读取,不能修改。如果修改了C++会报错。

void print(const int& a)
{
    //a++
}

参数传递

  • 使用传值方式传递非常小的对象
  • 使用传常量引用方式传递不需要修改的大对象
  • 函数要修改参数原始对象,才使用传引用方式

引用比指针在语法上简单

例:

传指针的指针

void m(int **p)
{

}
//调用
int i = 47;
int *ip = &i;
m(&ip);//取指针的地址,指针的指针。

上面的换成引用

void n(int*& t) //参数 实际上就是传一个指针,引用的是一个指针。
{
    //对地址进行的操作。
}
//使用
int *t = 0;
n(t);

引用就是别名,操作的就是原来的那个数。并且往往是更加简化的别名。

引用主要用于传递函数的参数和返回值。

指针地址

&:获取地址 :获取内存中的值 从内存中拿值。取出指针的值。 (int ) 类型是int类型的指针

给一个指针赋值,要赋一个值的地址,取地址&。

指针指向谁,就把谁的地址赋给指针。

-->.的区别

  1. CCC *m --> 指针指向 m-->b

  2. CCC m

. m.b

结点和指针

指针 *p 指针指向 p—>age 结点指向 t.age