精华内容
下载资源
问答
  • 指针与引用

    2017-07-22 13:12:59
    指针与引用

    指针与引用的区别


    定义

    指针:指针是一个变量,这个变量存储的是一个地址,指向内存的一个存储单元;
    引用:实质上跟原来的变量是同一个东西,相当于原来变量的一个别名。

    e.g.
    int a = 1;
    int* b = &a;
    int& c = a;
    //指针b存储变量a的地址;int型引用c取变量a的地址,相当于变量a的别名
    //使用时,*b = a = 1, c = a = 1;
    //指针b可以改变其存储的地址,指向其他的int变量
    //e.g. int d = 2; b = &d;
    //则改变后指针b存储的是变量d的地址 *b = d = 2;
    //引用在定义时必须初始化,不能只为空;而指针定义时可只为空指针NULL;
    //(此处的const引用是指不可以更改引用的对象,也即引用的地址,但可以对引用的对象的数据值进行修改)
    // sizeof指针得到的是指针本身的大小,sizeof引用得到的是引用对象的大小
    //指针可以有二级指针如int** a,没有二级引用

    作为函数参数传递时的区别

    指针作为参数:

    调用该函数时,若传入的参数为一般的非指针变量类型,应用取地址符 e.g. function(&parameter);
    (函数传入参数的实质是在函数模块中重新定义变量对传入的参数进行拷贝[形参],又由于指针的定义e.g int* a = &b),若传入的参数为指针,则function(pointer)。
    [C中没有引用的概念,因而采用二级指针的形式实现引用的功能(对传入参数的本身[实参]进行修改,而不单是对函数中的拷贝变量[形参]进行修改)]

    引用作为参数:

    实质上传递的是实参本身,即传入的不是实参的拷贝,因而对形参的值的修改其实是对实参的修改,所以在传递参数时用引用可以节省时间及空间。(对于不允许拷贝的以及不需要修改实参值的函数,使用const引用效率会更高)


    展开全文
  • 指针与引用

    2011-05-02 15:05:00
    指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先...
    指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ”),但是它们似乎有相同的功能。指针与引用都是让你间接
    引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
    
    首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,
    但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向
    一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
    
     “但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
    
    char *pc = 0;          // 设置指针为空值 
    
    char& rc = *pc;        // 让引用指向空值
    
    这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生)。应该躲开写出这样代码的人,
    除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。
    我们以后将忽略一个引用指向空值的可能性。
    
    因为引用肯定会指向一个对象,在C++里,引用应被初始化。
    
    string& rs;             // 错误,引用必须被初始化
    
    string s("xyzzy");
    
    string& rs = s;         // 正确,rs指向s
    
    指针没有这样的限制。
    
    string *ps;             // 未初始化的指针
    
                            // 合法但危险
    
    不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
    
    void printDouble(const double& rd)
    
    {
    
        cout << rd;         // 不需要测试rd,它
    
    }                       // 肯定指向一个double值
    
    相反,指针则应该总是被测试,防止其为空:
    
    void printDouble(const double *pd)
    
    {
    
      if (pd) {             // 检查是否为NULL
    
        cout << *pd;
    
     }
    
    }
    
    指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能
    改变。
    
    string s1("Nancy");
    
    string s2("Clancy"); 
    
    string& rs = s1;          // rs 引用 s1
    
    string *ps = &s1;         // ps 指向 s1 
    
    rs = s2;                 // rs 仍旧引用s1,
    
                           // 但是 s1的值现在是
    
                           // "Clancy"
    
    ps = &s2;               // ps 现在指向 s2;
    
                           // s1 没有改变
    
    总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要
    能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指
    向,那么你应该使用引用。
    
    还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能
    被赋值。
    
    vector<int> v(10);       // 建立整形向量(vector),大小为10;
    
                             // 向量是一个在标准C库中的一个模板(见条款M35) 
    
    v[5] = 10;               // 这个被赋值的目标对象就是操作符[]返回的值
    
        如果操作符[]返回一个指针,那么后一个语句就得这样写:
    
    *v[5] = 10;
    
    但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。当你知道你必须指向一个对象并且不想改变其指向时,
    或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,611
精华内容 6,244
关键字:

指针与引用