`

指针和引用的区别

阅读更多

一、
C++中引用和指针的区别
指针初始化的时候,可以指向一个地址,也可以为空。
引用必须初始化为另一个变量.
 int ival = 1024;
 int *pi  = &ival; // a pointer
 int &rval = ival; // a reference

二、
估计很多人在编写C++程序都或多或少的会用到pointer 和 reference这两种东西,但是他们两者到底有什么样的区别和联系呢,相信大多数人是不太了解的,今天我就两者的区别和联系从实际程序的角度来加以区别。
C/C++中的指针其实就是一个变量,和其他类型的变量是一个样子的,它是一个占用四字节的变量(32位机上),它与其他变量的不同之处就在于它的变量值是一个内存地址,指向内存的另外一个地方。reference我的理解就是一个别名,它和linux操作系统上的alias是一个样子的。再者,一个pointer变量可以指向NULL,表示它不指向任何变量地址,但是reference必须在声明的时候就得和一个已经存在的变量相绑定,而且这种绑定不可改变。下面是我写的一段程序来验证pointer与reference的区别和联系的,希望能对大家理解pointer & reference的区别和联系有所帮助:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
 int ival = 1024;
 int *pi  = &ival; // a pointer
 int &rval = ival; // a reference
 int jval = 4096;
 int xval = 8192;
 cout << "ival = " << ival << "\t";
 cout << "&ival = " << &ival << "\t";
 cout << endl;
 cout << "pi = " << pi << "\t";
 cout << "&pi = " << &pi << "\t";
 cout << "*pi = " << *pi << "\t";
 cout << endl;
 cout << "rval = " << rval << "\t";
 cout << "&rval = " << &rval << "\t";
 cout << endl;
 cout << "jval = " << jval << "\t";
 cout << "&jval = " << &jval << "\t";
 cout << endl;

 // change the values of the reference and the pointer
 pi = &jval;
 rval = jval;

 // print the changes
 cout << endl;
 cout << "ival = " << ival << "\t";
 cout << "&ival = " << &ival << "\t";
 cout << endl;
 cout << "pi = " << pi << "\t";
 cout << "&pi = " << &pi << "\t";
 cout << "*pi = " << *pi << "\t";
 cout << endl;
 cout << "rval = " << rval << "\t";
 cout << "&rval = " << &rval << "\t";
 cout << endl;
 cout << "jval = " << jval << "\t";
 cout << "&jval = " << &jval << "\t";
 cout << endl;

 cout << endl;
 *pi = xval;
 cout << "pi = " << pi << "\t";
 cout << "&pi = " << &pi << "\t";
 cout << "*pi = " << *pi << "\t";
 cout << endl;
 cout << "jval = " << jval << "\t";
 cout << "&jval = " << &jval << "\t";
 cout << endl;

 return 0;
}

一次的执行结果如下:
ival = 1024 

&ival = 0012FF7C
pi = 0012FF7C   &pi = 0012FF78  *pi = 1024
rval = 1024     &rval = 0012FF7C
jval = 4096     &jval = 0012FF70

 

ival = 4096     &ival = 0012FF7C
pi = 0012FF70   &pi = 0012FF78  *pi = 4096
rval = 4096     &rval = 0012FF7C
jval = 4096     &jval = 0012FF70

pi = 0012FF70   &pi = 0012FF78  *pi = 8192
jval = 8192     &jval = 0012FF70

如果有兴趣的话也可以使用其他类型的变量来测试,并且打印出各个变量占用内存的大小,我在这里就不把具体的程序贴出来了。

三、 C++点滴:向函数中传递指针和传递指针的引用的区别:

如果是传递指针,那么回先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针;
但是对于传递指针应用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了

对象指针和对象引用

指向类的成员的指针

    
C++中,可以说明指向类的数据成员和成员函数的指针。

    
指向数据成员的指针格式如下:

    <
类型说明符><类名>::*<指针名>

指向成员函数的指针格式如下:

    <
类型说明符>(<类名>::*<指针名>)(<参数表>)

    
例如,设有如下一个类A


    class A
    {
    public:
        int fun (int b) { return a*c+b; }
        A(int i) { a=i; }
        int c;
    private:
         int a;
    };

    
定义一个指向类A的数据成员c的指针pc,其格式如下:
    int A:: *pc = &A::c;
再定义一个指向类A的成员函数fun的指针pfun,其格式如下:
    int (A:: *pfun)(int) = A::fun;

    
由于类不是运行时存在的对象。因此,在使用这类指针时,需要首先指定A类的一个对象,然后,通过对象来引用指针所指向的成员。例如,给pc指针所指向的数据成员c赋值8,可以表示如下:

    A a;
    a.*pc = 8;

    
其中,运算符.*是用来对指向类成员的指针来操作该类的对象的。
    
如果使用指向对象的指针来对指向类成员的指针进行操作时,使用运算符->*。例如:
    A *p = &a;    //a

是类A的一个对象,p是指向对象a的指针。
    p ->* pc = 8;
    
让我们再看看指向一般函数的指针的定义格式:

    <
类型说明符>*<指向函数指针名>(<参数表>)

    
关于给指向函数的指针赋值的格式如下:


    <
指向函数的指针名>=<函数名>

    
关于在程序中,使用指向函数的指针调用函数的格式如下:


    (*<
指向函数的指针名

>)(<实参表>)

    
如果是指向类的成员函数的指针还应加上相应的对象名和对象成员运算符。


    
下面给出一个使用指向类成员指针的例子:

    #include <iostream.h>
    class A
    {
    public:
    A(int i) { a=i; }
    int fun(int b) { return a*c+b; }
    int c;
    private:
    int a;
    };

    void main()
    {
    A x(8);        //
定义类A的一个对象x
    int A::*pc;    //
定义一个指向类数据成员的指针
pc
    pc=&A::c;    //
给指针pc赋值

    x.*pc=3;    //
用指针方式给类成员c

赋值为3
    int (A::*pfun)(int);    //
定义一个指向类成员函数的指针
pfun
    pfun=A::fun;        //
给指针pfun赋值

    A *p=&x;        //
定义一个对象指针p,并赋初值为x
    cout<<(p->*pfun)(5)<<endl;    //
用对象指针调用指向类成员函数指针pfun指向的函数

    }

    
以上程序定义了好几个指针,虽然它们都是指针,但是所指向的对象是不同的。p是指向类的对象;pc是指向类的数据成员;pfun是指向类的成员函数。因此它们的值也是不相同的。

对象指针和对象引用

作函数的参数

    1. 
对象指针作函数的参数

    
使用对象指针作为函数参数要经使用对象作函数参数更普遍一些。因为使用对象指针作函数参数有如下两点好处:
    (1) 
实现传址调用。可在被调用函数中改变调用函数的参数对象的值,实现函数之间的信息传递。
    (2) 
使用对象指针实参仅将对象的地址值传给形参,而不进行副本的拷贝,这样可以提高运行效率,减少时空开销。

    
当形参是指向对象指针时,调用函数的对应实参应该是某个对象的地址值,一般使用&后加对象名。下面举一例子说明对象指针作函数参数。

    #include <iostream.h>
    class M
    {
    public:
        M() { x=y=0; }
        M(int i, int j) { x=i; y=j; }
        void copy(M *m);
        void setxy(int i, int j) { x=i; y=j; }
        void print() { cout<<x<<","<<y<<endl; }
    private:
        int x, y;
    };

    void M::copy(M *m)
    {
    x=m->x;
    y=m->y;
    }

    void
fun(M m1, M *m2);
    void main()
    {
    M p(5, 7), q;
    q.copy(&p);
    fun(p, &q);
    p.print();
    q.print();
    }

    void fun(M m1, M *m2)
    {
    m1.setxy(12, 15);
    m2->setxy(22,25);
    }

    输出结果为:
    5,7
    22,25
    
从输出结果可以看出,当在被调用函数fun中,改变了对象的数据成员值[m1.setxy(12, 15)]和指向对象指针的数据成员值[m2->setxy(22, 25)]以后,可以看到只有指向对象指针作参数所指向的对象被改变了,而另一个对象作参数,形参对象值改变了,可实参对象值并没有改变。因此输出上述结果。

    2. 
对象引用作函数参数

    
在实际中,使用对象引用作函数参数要比使用对象指针作函数更普遍,这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点,而用对象引用作函数参数将更简单,更直接。所以,在C++编程中,人们喜欢用对象引用作函数参数。现举一例子说明对象引用作函数参数的格式。

    #include <iostream.h>
    class M
    {
    public:
    M() { x=y=0; }
    M(i
nt i, int j) { x=i; y=j; }
    void copy(M &m);
    void setxy(int i, int j) { x=i; y=j; }
    void print() {cout<<x<<","<<y<<endl; }
    private:
    int x, y;
    };

    void M::copy(M &m)
    {
    x=m.x;
    x=m.y;
    }

    void fun(M m1, M &m2);

    void main()
    {
    M p(5, 7), q;
    q.copy(p);
    fun(p, q);
    p.print();
    q.print();
    }

    void fun(M m1, M &m2)
    {
    m1.setxy(12, 15);
    m2.setxy(22, 25);
    }

    该例子与上面的例子输出相同的结果,只是调用时的参数不一样。

3
this指针

    this
指针是一个隐含于每一个成员函数中的特殊指针。它是一个指向正在被该成员函数操作的对象,也就是要操作该成员函数的对象。

    
当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含作用this

分享到:
评论

相关推荐

    C++指针与引用的区别

    C++指针与引用的区别 指针和引用是C++语言中两种不同的概念,初学者容易把它们混淆一起。这两种概念都是地址的概念,但它们有很多不同的特点和应用场景。 相同点 1. 都是地址的概念;指针指向一块内存,它的内容...

    C++重要的谨记指针和引用的区别

    在C++编程语言中,指针和引用是两种非常关键的概念,它们都允许我们间接访问内存中的对象。然而,它们之间存在着本质的区别,理解和掌握这些差异对于编写高效、安全的代码至关重要。 首先,指针是一个变量,它存储...

    **p与 *&p的区别, 即指向指针的指针和引用指针变量的区别

    在C语言中,**p与*&p是两个常见的指针操作表达式,它们分别涉及到指向指针的指针和引用指针变量的概念。理解这两者的区别,有助于更准确地掌握指针的操作和内存管理。 首先,我们需要明确**p的含义。当声明一个指针...

    指针传递和引用传递的区别

    如果想要通过指针参数改变主调函数中的变量,需要使用指向指针的指针或指针引用。 引用传递参数则有所不同,虽然引用在函数内部也是一个局部变量,但它存储的是原始变量的地址。因此,对引用参数的任何操作都会直接...

    c++中指针和引用的区别

    指针和引用的区别 在 C++ 编程语言中,指针和引用是两个常用的概念,但是初学者容易混淆它们二者之间的区别。在本文中,我们将从概念、函数参数传递和编译角度来阐述指针和引用的区别。 概念上,指针是一个变量,...

    C++指针与引用

    此时,使用指针引用就显得尤为重要了。 例如,如果我们想要在函数`func1`中更新`pMyClass`所指向的对象,而不只是修改`pMyClass`本身的值,我们可以这样声明函数: ```cpp void func1(MYCLASS*& pMyClass) { ...

    C++引用&和指针在作为形参时的区别

    在C++中,引用(reference)和指针都是用来间接访问其他对象的工具,但它们在使用和行为上有显著的差异。引用的概念是C++特有的,而指针在C和C++中都存在。理解这两种机制的区别对于编写高质量的C++代码至关重要。 ...

    值传递,指针传递,引用传递的区别,内含可运行代码和详细解释

    另一方面,值传递由于形参和实参内存地址不一样,有些功能并不能实现(swap()),因此,除了极为简单的函数会使用值传递外,大多数会采用引用传递。而对于指针传递,则在涉及数组的情况下使用较多,因为指针本身会给...

    指针和引用

    ### 引用与指针的区别 1. **初始化**:引用在声明时必须初始化,而指针可以在任何时候初始化。 2. **可变性**:引用初始化后不能改变其指向的对象;指针可以在程序运行期间重新指向其他对象。 3. **空值**:引用不...

    智能指针与引用计数详解

    - 解引用运算符(`*`和`-&gt;`),使得智能指针可以像普通指针一样使用。 此外,可能还会包含一些额外的辅助函数,如检查对象是否为空,获取引用计数值等。通过阅读和理解这个demo,开发者可以深入理解智能指针的工作...

    指针与引用的区别

    指针和引用是C++语言中的两种非常重要的概念,它们都是用来间接访问内存中的对象,但有着本质的区别。 首先,指针是一个变量,它存储的是另一个变量的地址。这意味着指针可以被重新赋值,指向不同的对象。例如,你...

    指针和引用的区别1

    在编程领域,理解和掌握指针和引用的区别是C++编程中的关键知识点。指针和引用都是C++中用于间接访问对象的方式,但它们之间存在显著的差异。 1. 指针: - 指针是一个变量,它存储的是另一个变量的地址。可以有...

    c++指针和引用的使用浅谈

    在C++编程语言中,指针和引用是两种非常重要的概念,它们都允许我们间接访问内存中的对象。本文将深入探讨这两个主题,并通过实例来...通过实际编程练习和分析,我们可以更好地掌握它们的区别和用法,提升编程技能。

    指针和引用的相同点和不同点的总结.pdf

    ### 指针和引用的相同点和不同点的总结 #### 相同点: - **地址的概念**:无论是指针还是引用,在C++中都与内存地址有关联。它们都可以用来表示或访问内存中的数据。 #### 不同点: 1. **实体与别名**: - **...

    c++指针和引用

    在C++编程语言中,指针和引用是两种非常重要的概念,它们允许程序员对内存进行直接操作,提高代码的灵活性和效率。对于初学者来说,理解并熟练掌握这两个概念至关重要。 首先,我们来探讨指针。指针在C++中扮演着...

    C++中的指针与引用详细解读

     在深入介绍之前我们首先来看一下指针和引用的定义、指针和引用的区别,然后分别针对指针和引用展开讨论,深入细节为何有这些差异。  指针的权威定义:  In a declaration T D where D has the form * cv-qua

    导图_指针与引用

    本篇将详细阐述指针与引用的区别和联系,帮助你深入理解这两个核心概念。 首先,我们来看指针。指针是C++中的一个变量,它存储的是内存地址,即另一个变量的位置。通过指针,我们可以间接地访问和修改该地址所对应...

Global site tag (gtag.js) - Google Analytics