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

    千次阅读 2015-10-20 19:33:37
    本文阐述了为什么需要使用指针的指针(pointer to pointer)和指针的引用(reference to pointer)来修改传递给函数的指针变量,希望能够使读者更好的理解它们的用途。为了方便,我们分别用ptr-to-ptr和ref-to-ptr表示...

    简介

    本文阐述了为什么需要使用指针的指针(pointer to pointer)和指针的引用(reference to pointer)来修改传递给函数的指针变量,希望能够使读者更好的理解它们的用途。为了方便,我们分别用ptr-to-ptr和ref-to-ptr表示它们。 本文不涉及如何使用ptr-to-ptr作为二维数组的指针。请记住,在C和C++编程语言中都可以使用ptr-to-ptr,但是只能再C++中使用ref-to-ptr.


    为什么需要它们


    当我们使用 “传递指针“的方式将一个指针变量传递给某个函数,仅仅是指针的一个拷贝传递给了函数。 可以说, 我们按照传值的方式传递指针。在大多数情况下,这么做没有任何问题。 然而, 当我们需要在函数内部对其进行修改的时候,原始的指针变量并不会发生任何改变,它将仍然指向旧值。 下面的代码演示了下面的行为:


    //global variable
    int g_One=1;
    //function prototype
    
    void func(int* pInt);
    
    int main()
    {
      int nvar=2;
      int* pvar=&nvar;
      func(pvar);
      std::cout<<*pvar<<std::endl;//Will still show 2
    
      return 0;
    }
    
    void func(int* pInt)
    {
      pInt=&g_One;
    }

    Pointer to Pointer 语法

    下面的代码描述了如何调用带有ptr-to-ptr参数的函数

    //function prototype
    void func(int** ppInt);
    
    int main()
    {
      int nvar=2;
      int* pvar=&nvar;
      func(&pvar);
      ....
      return 0;
    }

    void func(int** ppInt)
    {
      //Modify the pointer, ppInt points to
      *ppInt=&g_One;
    
      //You can also allocate memory, depending on your requirements
      *ppInt=new int;
    
      //Modify the variable, *ppInt points to
      **ppInt=3;
    }

    Reference to Pointer语法

    同理,下面的代码描述了如何调用带有ptr-to-ptr参数的函数以及函数中修改指针

    //function prototype
    void func(int*& rpInt);
    
    int main()
    {
      int nvar=2;
      int* pvar=&nvar;
      func(pvar);
      ....
      return 0;
    }

    void func(int*& rpInt)
    {
      //Modify what rpInt and pvar is pointing to, to g_One
      rpInt=&g_One;
    
      //You can also allocate memory, depending on your requirements
      rpInt=new int;
    
      //Modify the variable rpInt points to
      *rpInt=3;
    }


    展开全文
  • C++中引用、指针的指针、指针的引用解析

    千次阅读 多人点赞 2014-04-15 14:55:15
    对C++指针和引用的一点理解,C++初学者及对指针的引用还有不解的同学可以看看。

    本文为znd8866原创,转载请注明出处。

    由于本人功力有限,有错误之处恳请指正,谢谢。

    (1)这样写为什么会错?

    看下面一段程序:

    void Fun1 (MyClass *ptr)

    {

           ptr=(MyClass*)malloc(MyClass);//或者用new来分配:ptr=new MyClass()

    }

    MyClass *p=new MyClass();

    Fun1(p);

    会发生什么情况呢?

    首先编译器会分配一个MyClass空间,并在栈上创建指针p,它指向创建的MyClass空间:

    然后调用Fun1函数,Fun1函数会创建一个新的MyClass类型的指针ptr,它的值既是p的值,它也指向创建的MyClass对象:

    然后Fun1函数调用malloc函数,它向系统申请一个新的MyClass空间,将新的MyClass空间的首地址赋给ptr:

    相信读者现在已经看出来了,是的,他最终变成了下面的形式:

    也就是说,调用函数Fun1后,指针p的值并没有改变,它与调用前没有任何区别。但我们的意图是让Fun1分配新的存储空间给指针p,这显然达不到我们的期望,那么应当怎么做呢?

    在不改变函数Fun1返回值的情况下,有两种方法:

    (1)   使用指针的指针

    (2)   使用指针的引用

    (2)指针的指针

    看下面的程序:

    void Fun1 (MyClass **ptr)

    {

           *ptr=(MyClass*)malloc(MyClass);

    }

    MyClass *p=new MyClass();

    Fun1(&p);

    会发生什么情况呢?

    首先,编译器会分配一个MyClass空间,并在栈上创建指针p,它指向创建的MyClass空间:

    图中0x00EEBBDD是p指针在栈上的地址。

    然后调用Fun1函数。首先,函数Fun1会创建一个指针的指针ptr,它指向的指针指向MyClass类型,它的值即p指针的地址0x00EEBBDD,如下图:

    然后,Fun1调用malloc函数,它向系统申请一个新的MyClass内存空间,将这个新的空间的首地址赋给*ptr,注意是*ptr而不是ptr,*ptr就是p的值,即p的值被改变:

    从图中可以看出,p的值被改变,他指向了新的空间,达到了我们的期望,但要注意这样会发生内存泄露,即原来分配的0x00FF44DD内存没有释放,这可以在分配内存前先释放原内存来解决,或者使用下面讲的引用。

    (3)引用

    记住一点:凡是对变量的引用的改变都是对变量本身的直接改变。

    这里我们不讨论引用是否占用内存空间(许多书上都说引用不占内存空间,但如果你仔细观察反汇编代码的话,其实引用是占内存空间的),也不讨论编译器对引用的处理(其实编译器是把引用翻译为指针常量的,指针的值不可以改变,但指针指向的变量的值可变),我们仅讨论引用的特性及应用。

    引用相当于变量的别名,改变引用就相当于改变变量本身,引用在使用上是和变量等价的。

    例如:

    void fun (int &a,int &b)

    {

           inttemp=a;

           a=b;

           b=temp;

    }

    int i=3,j=4;

    fun (i,j);

    会发生什么呢?

    在调用fun函数时,首先fun函数会为变量i、j分别创建引用a、b,如下:

    从这里就可以看出,如果改变a、b的值,就可以直接改变i、j的值。

    (4)指针的引用

    到此问题就变得很简单了,在使用指针的引用时,就相当于使用指针本身。

    看下列代码:

    void Fun1 (MyClass *&ptr)

    {

           ptr=(MyClass*)malloc(MyClass);//或者ptr=new MyClass();

    }

    MyClass *p=new MyClass();

    Fun1(p);

    会发生什么呢?

    首先,编译器会分配一个MyClass空间,并在栈上创建指针p,它指向创建的MyClass空间:

    然后调用Fun1函数,Fun1函数会创建一个指针p的引用ptr,如下所示:

    相信读者已经看出来了,ptr的值就是p的值,改变ptr的值就是对p的值的直接改变。

    至此对指针与引用的讨论结束。


    展开全文
  • C++ 指针的引用和指向引用的指针

    万次阅读 多人点赞 2019-02-06 18:31:49
    使用指针的一个简单例子就是: int v = 1; int *p = &amp;v; 需要预先强调的是没有指向引用的指针!因为引用不是对象,没有地址。但是指向引用的指针是什么形式呢? 是对一个引用进行如下取地址吗: int v = 1; ...

    指向引用的指针

    使用指针的一个简单例子就是:

    int v = 1;
    int *p = &v;
    

    需要预先强调的是没有指向引用的指针!因为引用不是对象没有地址。但是指向引用的指针是什么形式呢?
    是对一个引用进行如下取地址吗:

    int v = 1;
    int &ri = v;	// 整型变量v的引用
    int *p = &ri;	// 这是指向引用的指针吗?
    

    事实上不是,这是一个普通的整型指针,虽然我们说引用没有地址,但是对引用ri的操作实际上是对v的操作。这是是定义了一个整型指针,并且让它指向了v
    那如何定义一个指向引用的指针呢(虽然是不合理的请求)?当我们定义指针的时候,我们用到了*,那么当我们定义指向引用的指针时,免不了要用到*&

    int v = 1;
    int &ri = v;
    // int &*p = &ri;
    

    由于引用并不存在地址,因此第三行将会报错。我们可以从右往左读,*表明p是一个指针,余下的&说明了p指向类型的类型。

    指针的引用

    之前说到指向引用的指针,现在来说指针的引用就容易多了。

    int v = 1;
    int *p = &v;'
    int *&rp = p;
    

    &说明r是一个引用。*确定r引用的类型是一个指针。

    其他

    因为引用不是对象,故无引用的数组,无指向引用的指针,无到引用的引用:

    int& a[3]; // 错误
    int&* p;   // 错误
    int& &r;   // 错误
    

    [1] 引用声明
    [2] 指向指针的引用

    展开全文
  • 展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了...

     原文地址,感谢原作者

    https://www.cnblogs.com/li-peng/p/4116349.html

     

     

     

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。(这里说的指针的指针不是一个二维数组)

    为什么需要使用它们

    当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。

    如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来

    的值。我们用下边的代码说明一下问题:

    复制代码

    int m_value = 1;
    
    void func(int *p)
    {
        p = &m_value;
    }
    
    int main(int argc, char *argv[])
    {
        int n = 2;
        int *pn = &n;
        cout << *pn << endl;
        func(pn);
        cout << *pn <<endl;
        return 0;
    }

    复制代码

    看一下输出结果

    输出的是两个2

    使用指针的指针

    展示一下使用指针的指针做为参数

    复制代码

    void func(int **p)
    {
        *p = &m_value;
    
        // 也可以根据你的需求分配内存
        *p = new int;
        **p = 5;
    }
    
    int main(int argc, char *argv[])
    {
        int n = 2;
        int *pn = &n;
        cout << *pn << endl;
        func(&pn);
        cout << *pn <<endl;
        return 0;
    }

    复制代码

    我们看一下 func(int **p)这个方法

    • p:  是一个指针的指针,在这里我们不会去对它做修改,否则会丢失这个指针指向的指针地址
    • *p:  是被指向的指针,是一个地址。如果我们修改它,修改的是被指向的指针的内容。换句话说,我们修改的是main()方法里 *pn指针
    • **p: 两次解引用是指向main()方法里*pn的内容

    指针的引用

    再看一下指针的引用代码

    复制代码

    int m_value = 1;
    
    void func(int *&p)
    {
        p = &m_value;
    
        // 也可以根据你的需求分配内存
        p = new int;
        *p = 5;
    }
    
    int main(int argc, char *argv[])
    {
        int n = 2;
        int *pn = &n;
        cout << *pn << endl;
        func(pn);
        cout << *pn <<endl;
        return 0;
    }

    复制代码

    看一下func(int *&p)方法

    • p:  是指针的引用,main()方法里的 *pn
    • *p:是main()方法里的pn指向的内容。

     

    展开全文
  • 这张图片我们可以看出head指针的地址与head指针所指向的内容的地址也就是值的地址如下图: 继续Debug 显而易见p指针所在的地址与head不同 说明了什么? 说明了当指针作为函数参数传递指针其实就是值传递(也就是把...
  • 什么情况下使用指针的引用(指针)

    千次阅读 多人点赞 2019-05-12 15:52:12
    如果想要修改指针的指向,就要用指针的指针,或者指针的引用。 大部分情况下,用指针和引用做参数,只是想要修改指针所指变量的值,并没有想修改指针的指向。但是如果指针所指的这块内存在调用子函数结束之后发生了...
  • 1. 指向指针的引用 #include #include using namespace std; // int *&lhs 的定义应该从右向左理解: // lhs 是一个引用,与指向 int 的指针相关联。 // 也就是说,lhs 是传递进 ptrswap 函数的指针的别名。 // ...
  • 数组的引用和指针的引用

    千次阅读 2015-09-09 09:00:08
    数组的引用和指针的引用 数组的引用 通过引用传递数组,和其他类型一样,数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小...
  • 指向指针的引用

    千次阅读 2016-02-22 11:07:37
    但指针是对象,所以存在对指针的引用: int i = 42; int *p; int *&r = p;要理解r的类型到底是什么,最简单的办法是从右向左阅读r的定义。离变量最近的符号(&)对变量的类型有最直接的影响,因此r是一个引用。声明...
  • const指针的引用

    2015-10-30 11:19:47
    int * 是一种指向int类型的指针。 const int* 是指向const int类型的指针。...int *const 指向int类型的常量指针。...(指向常量指针的引用) int* const& 指向指针的常量引用。 const int* const& 指向
  • C++ 函数传递指针的引用或指针的指针,指针的值被改变标签(空格分隔): C++ Pointer如下图的代码:容易误以为tree1的值会在函数Mod…中随着p1,p2改变,但实际上tree1与p1,p2只是在Tree这一级别一起改变,在Tree* ...
  • 指针和指针的引用作为参数——c++

    千次阅读 2015-09-19 21:57:50
    指针和指针的引用作为参数–c++指针都清楚,存放变量地址的变量。那么指针指向的数据是可以改变,而指针本身是不可以改变的。表示为: *P; 指针的引用, 相当于指针的指针。 作为参数传递时,这样指针的数值是可以...
  • C++ 引用的指针和指针的引用

    万次阅读 多人点赞 2018-02-24 21:07:23
    C++不允许定义引用的指针,因为引用本身只是与另一个对象绑定在一起该对象别名,而并非一个对象,所以标准规定不能定义指向引用的指针报错: int a = 20; int &amp;*ptr = &amp;a;// error 参考&...
  • 结构体的引用与结构体指针的引用

    千次阅读 2014-05-04 15:07:43
    结构体的引用与结构体指针的引用 当结构体是一个指针时要引用结构体的成员就用-> 而如果不是指针就用. 如: struct msg_st {  int a; }; struct msg_st msg; struct msg_st *ms;//需要初始化 msg.a = ...
  • 那么,能否定义指针的引用呢?答案是肯定的,因为指针本身就是一个对象。即然是对象,就能定义一个引用邦定该对象。先来看看指针的引用的用法: 以int类型为例如下:void ReferencePointer() { int i = 5; // ...
  • 详细讨论了指针,解引用,取地址,引用,二级指针
  • 指针的传递 当把指针作为一个参数传给函数使用时,传递的是指针的一个副本,即指针的值传递。如果在函数内部修改指针时会出现问题,这样只是修改指针的副本,而原来的指针保留着原来的值。...指针的引用
  • C++中引用,指针,指针的引用,指针的指针

    万次阅读 多人点赞 2013-02-22 10:35:25
    定义一个指针的三种写法都对:1. int * p; 2. int* p; 3. int *p; 习惯不同而已 定义一个函数指针的三种写法都对:1. int *p(); 2. int * p(); 3. int* p(); 1、指针传递和引用传递 在C语言中,如果要实现...
  • class base { public: base(){} virtual ~base(){} }; class derive : public base { public: derive(){} virtual ~derive(){} ...二级指针或者指针的引用不能在函数执行时被强转成基类吗?
  • oc中的对象都是使用指针引用的,若没有指针的引用,对象会被自动销毁 在书里看到这句话。 加入我有个对象 [[Person alloc]init]; 我不用指针去引用它,是不是走到下一步它就会被销毁?
  • 如何定义指针的引用

    千次阅读 2013-12-12 19:21:04
    int *out = NULL; void foo(int *&out) {  out = new int(5);...像上面的代码就定义了一个指针的引用,作为foo函数的形参。这样做可以在函数里修改指针out的值。比定义一个二级指针要看起来简单一点。
  • 二级指针和指针的引用之间的区别

    千次阅读 2011-02-01 16:58:00
    看资料说: 指针的引用不会产生临时变量, 不会产生拷贝操作.我自己的多余体会: 指针的引用在实际编码时,操作比二级指针简单, 书写简洁.做个实验验证下.
  • C++ - 指针的引用 详解 及 代码

    千次阅读 2013-11-21 16:58:38
    指针的引用 详解 及 代码   本文地址: http://blog.csdn.net/caroline_wendy   指针(*)和引用(&), 解引用(*)和取地址(&), 主要观察是在左面, 还是在右面, 如果在左面是前者, 在右面是后者; 如果比较多, 则要认真...
  • C/C++:定义指针的引用

    千次阅读 2018-06-10 12:37:21
    C++中定义指针的引用有什么好处呢? 首先指针引用的定义方式(以char类型为例): char* &amp;ptr = xxx 我们知道在C语言中如果想改变实参指针所指向的位置,就要定义重指针,如下面的例子 // 错误 实参...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,974
精华内容 21,589
关键字:

指针的引用