zoukankan      html  css  js  c++  java
  • 关于c/c++指针,指针的指针

    伪军迷祝:建军节快乐

    变量是一个容器,用来存东西,指针变量也是如此 ,只不过指针变量只能用来保存地址,指针a的解引用即得到这个容器(指针a)所保存的地址A上所存放的东西(这个东西是值或另一个指针b(保存或者说指向地址B,指针a即指向指针的指针))。指针a保存着地址A地址可以理解为指针a指向地址A,a是左值,A是右值,此时可以认为指针a即代表地址A(个人理解,有错还望指出)

    比如int a=15,你可以说a就是15,你也可以给a赋其他值,这样a又代表其他值,指针和地址的关系也是如此

    当调用一个函数时,实际上入参使用的都是副本(除非是引用),指针也不例外。举个例子如:

    void func(int a, int * p);

    当调用func时无论是a还是p其实传入的都是副本,假设调用func时传给p的值是pt,则p这个pt的副本保存着和pt一样的地址,*p和*pt都是同一地址上的值,改变*p也就改变了*pt。

    但是,对p本身的操作是不会影响pt的,例如不能在函数func内部给p动态分配内存,或者使p指向别的地方,因为这只是对p这个副本进行操作,改变了p保存的地址,但是对实际调用func时的入参pt没有任何影响,

    如果想改变pt指向的位置,我们可以使用指针的指针,如:

    void func(int a, int **ptr);

    (对c++而言,还可以用指针的引用,这个更好理解,如: void func(int a, int * &ptr);)

    调用func时,在ptr位置需要传入指针的地址&pt。

    假设在func内部申请了内存(m类型为 int *):

    m = malloc(size);

    想让pt指向这块新申请的内存,可以这样:

    *ptr = m;

    ptr类型为int **,pt是一个指针,所以pt的值是一个地址,假设该值为addr1,pt所在位置的地址为addr2,而指针的指针ptr的地址为addr3,这个地址上保存的是pt这个指针所在位置的地址addr2,

    因此,对ptr解除引用*ptr即为ptr保存的地址addr2上的值addr1(即pt),

    因此

    *ptr = m;

    即等价于:

    pt = m;

    也就让pt指向了一块新内存。

  • 相关阅读:
    JS 原型模式 工厂模式 构造函数的区别
    JS 深入1
    理解DOM的一个例子
    Fuzzing参数
    神经网络相关知识和概念整理
    [转载] 系统、模型和仿真
    frp内网穿透,从外网访问内网资源
    常用软件配置
    141. 环形链表
    501. 二叉搜索树中的众数
  • 原文地址:https://www.cnblogs.com/tan-wm/p/13413921.html
Copyright © 2011-2022 走看看