zoukankan      html  css  js  c++  java
  • 二级指针的用法

    有的时候,在使用二级指针和指针的时候会有一些困惑,在这里总结一下.

    概念就不多说了,直接进入正题.

    结合代码讨论二级指针的问题.

    1:void test(int a,int b){

    int t;

    t = a;

    a = b;

    b = t;

    }

    int main(){

     int a=10,b=15;

     test(a,b);

    }

    2.void test(int *a,int *b){

    int temp = 0;
    int *t=&temp;

    *t = *a;

    *a = *b;

    *b = *t;

    }

    int main(){

     int a=10,b=15;

     test(&a,&b);

    }

    3.void test(int *a){

       a=(int*)malloc(100);

    }

    int main(){

     int *a;

     test(a);

    }

    4.void test(int **a){

         *a=(int*)malloc(100);

    }

    int main(){

     int *a=NULL;

    int **p=&a;

     test(p);

    }

    我们知道,函数有自己的作用域,当自动变量超过了函数的作用域就会释放掉,函数的参数是通过复制来传递的.

    结合上述观点来看这四种函数.

    1.函数复制a,b的值,在函数中交换了a,b的值,函数返回的时候.复制的临时a,b释放掉了,所以,a,b的值并没有交换.

    2.函数复制的是a,b的地址.在函数中交换了这个地址指向的值,所以a,b的值被交换.

    3.函数复制a的地址,然后分配了一块内存跟复制的a的地址关联,而外部的实参并没有跟这块地址关联,所以当函数结束的时候,形参a释放掉了.实参a依然指向NULL

    4.在mian函数中,a指向一个NULL,而p指向a的地址,把p传入函数,复制p的地址.然后p指向的地址依然是a,所以,p解引用之后分配的内存依然跟a做了关联.当函数结束的时候,p的形参释放,分配的地址依然可以通过解引用p得到.

  • 相关阅读:
    【递推】【概率】Gym
    【坐标变换】【二维偏序】【线段树】Gym
    【DLX算法】hdu3498 whosyourdaddy
    【DLX算法】poj2676 Sudoku
    【Pollard-rho算法】【DFS】poj2429 GCD & LCM Inverse
    Pollard-rho算法:模板
    【筛法求素数】【推导】【组合数】UVALive
    【二项式定理】【DFS】UVALive
    【并查集】【枚举倍数】UVALive
    【Floyd算法】Gym
  • 原文地址:https://www.cnblogs.com/weichao975/p/7129106.html
Copyright © 2011-2022 走看看