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指向了一块新内存。

  • 相关阅读:
    java_oop_方法2
    POJ 3276 Face The Right Way(反转)
    POJ 3276 Face The Right Way(反转)
    POJ 2566 Bound Found(尺取法,前缀和)
    POJ 2566 Bound Found(尺取法,前缀和)
    POJ 3320 Jessica's Reading Problem(尺取法)
    POJ 3320 Jessica's Reading Problem(尺取法)
    POJ 3061 Subsequence(尺取法)
    POJ 3061 Subsequence(尺取法)
    HDU 1222 Wolf and Rabbit(欧几里得)
  • 原文地址:https://www.cnblogs.com/tan-wm/p/13413921.html
Copyright © 2011-2022 走看看