C 引用和指针

原文链接

引用是什么

引用不是重新定义一个变量,而是给一个已经存在的变量取的别名。 
语法:类型& 引用变量名=已定义的变量名 

引用的特点: 
1、一个变量可以有多个别名。 
2、引用必须初始化。 
3、引用只能在初始化的时候使用一次,不能在作为其它变量的别名。 

引用注意事项:

1.引用必须被初始化; 
2.引用一旦与初始值对象绑定,就不会变化(引用从一而终)!!! 
3.引用初始值必须为一个对象,不能使常数 
4.引用必须与被引用的对象类型一致

重点:作用在引用上的所有操作事实上都是作用在该引用所绑定的对象上。

使用引用有何优点?

  在传参的时候,使用指针传参,编译器需要给指针另行分配存储单元,存储一个该指针的副本,在函数中对这个副本进行操作;而使用引用传参,编译器就不需要分配存储空间和保存副本了,函数将直接对实参进行操作。所以使用引用使得程序的运行速度更快,执行效率更高。

这里写图片描述 
我们可以看出别名和本来的变量指向同一块空间,是否引用变量的改变会引起原有变量的改变?这里写图片描述

const引用

#include<iostream>
using namespace std;
void test(){
    int a = 4;
    const int& b = a;
    a = 10;       //a改变b也会随之改变
    //b = 12;    //常量不可以赋值

    const int c = 3;
    const int& d = c;
    //int& e = d;   //类型不匹配
    const int& e = d;//常量具有常性,只有const修饰的引用才能引用常量


    double f = 1.1;
    //int& g = f;
    const int& g = f;
    //double 无法转为int& ,
    //f在赋值时候会生成一个临时变量,临时变量具有常性,所以不能赋值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

引用做参数

以Swap函数为例,比较值传递、址传递,引用传递。


#include<iostream>
using namespace std;

//值传递,无法实现交换两值的效果
void Swap1(int a, int b){
    int tmp = a;
    a = b;
    b = tmp;

}

//址传递
void Swap2(int* a, int* b){
    int tmp = *a;
    *a = *b;
    *b = tmp;

}

//传引用
void Swap3(int& a, int& b){
    int tmp = a;
    a = b;
    b = tmp;

}

int main(){
    int a = 10;
    int b = 20;
    int& c = a;
    int& d = b;
    Swap1(a, b);// 10 20
    cout << a;
    cout << b << endl;
    Swap3(c, d);//20 10
    cout << a;
    cout << b << endl;
    Swap2(&a, &b);//10 20此处是将上次交换后的20 10再次交换
    cout << a;
    cout << b << endl;

    system("pause");
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

所以说在传参这一块引用和指针一样可以避免传值,形参是实参的临时拷贝,所以形参改变不会影响到实参。 
….总结:传参传结构体时要避免直接传结构体,因为一旦结构体存在数组时,会先开好等大的空间然后一步步将数据拷进去,这样就会很低效。

引用做返回值

#include<iostream>
using namespace std;


//传值做返回值
int Add(int a, int b){
    int ret = a + b;
    return ret;
}


int& Add1(int a, int b){
    int ret = a + b;
    return ret;
}

void test(){
    int a = 6;
    int b = 4;
    int c = Add(a, b);
    int d = Add1(a, b);

}
int main()
{
    test();
    system("pause");
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

这里写图片描述
…….结论: 
1、不要返回一个临时变量的引用。 
2、如果返回对象出了作用域仍然存在,尽量使用引用作为返回值,会更加高效。

指针和引用的区别与联系:

1、引用只能在定义时初始化一次,之后不可以改变指向其他变量;指针变量的值可变。 
2、引用必须指向有效的变量,指针可以为NULL。 
3、sizeof(引用)得到所指向变量的大小,sizeof(指针)得到指向变量的地址的大小 
4、指针++,加的是所指向类型的大小,引用++加的是1,加在变量上。 
5、指针会有野指针的风险,所以引用相较于指针更加安全。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章