C++语言— 引用与指针的区别

来源:互联网 发布:dijkstra算法 c语言 编辑:程序博客网 时间:2024/05/17 01:00

                引用的意义和使用



刚刚开始接触C++,当然第一个学到的知识点就是引用,那么什么是引用呢?

引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名

定义的格式为:    类型 &引用变量名 = 已定义过的变量名;

引用的特点:
  1. 一个变量可取多个别名。
  2. 引用必须初始化。
  3. 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
现在我们来一个例子试一试:

#include<iostream>#include<windows.h>using namespace std;void TestReference1(){int a = 1;int& b = a;cout << "a:address->" << &a << endl;cout << "b:address->" << &b << endl;a = 2;b = 3;int& c = b;  // 引用一个引用变量,别名的别名c = 4;}int main(){TestReference1();system("pause");return 0;}
看看结果呢:



引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名

结果就是对这些话充分的论证。

const 引用:

void TestReference2()
{
    intd1= 4;
    constint&d2=d1;
    d1= 5;          // d1改变d2的值也会改变。
    //d2 = 6;        //不能给常量(不能被修改的量)赋值

    constintd3= 1;
    constint&d4=d3;
    //int&d5 = d3;
    constint&d6= 5;  //常量具有常性,只有常引用可以引用常量

    doubled7= 1.1;
     //int& d8 = d7; //d7double类型,d8int,d7赋值给d8时要生成一个临时变量
     //也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。
     //这里其实d7为d8生成了一个强制类型转换成int的临时变量,所以不能赋值。
    constint&d9=d7;
}

引用作为参数:

如果形参为引用类型,则形参是实参的别名。
这个例子就是利用引用来交换值。

void Swap(int& left, int& right){int temp = left;left = right;right = temp;}void TestReference2(){int a = 3;int b = 8;cout << "a:" << a << endl;cout << "b:" << b << endl;Swap(a, b);cout << "a:" << a << endl;cout << "b:" << b << endl;}int main(){TestReference2();system("pause");return 0;}


还有一个需要提醒的:当不希望函数内改变参数x的值时,尽量使用常引用传参



传值做返回值&传引用作为返回值

int& Add(int d1, int d2)// int Add ( int d1 , int d2){int ret = d1 + d2;return ret;}void test(){int a = 3, b = 4;int c = Add(a, b);cout << "c:" << c << endl;}int main(){test();system("pause");return 0;}


不要返回一个临时变量的引用

如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。


指针和引用的区别:


1.引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。

2.引用必须指向有效的变量,指针可以为空。

3.sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof
指针是对象地址的大小。

4.指针和引用自增(++)自减(--)意义不一样。

5.相对而言,引用比指针更安全。


一点小建议:指针比引用更灵活,但是也更危险。使用指针时一定要注意检查指针是否为空。指针所
指的地址释放以后最好置0,否则可能存在野指针问题。















1 1
原创粉丝点击