从一级指针到二级指针

  昨天,写了一些关于一级指针的见解,那么这次我们再来看看二级指针的一些用法,也可以说是我自己的一些见解
  所谓二级指针其实和一级指针差不多,一级指针是存储0级指针地址的变量,(一定要记住这一点:指针也是变量,编译器会给它分配内存空间,它的内存空间和它指向的内存空间是不同的,它的内存空间里只能存储空间地址;)所以二级指针就是储存一级指针地址的变量,或者说二级指针是指向一级指针空间的变量;还可以说是指向一级指针的指针;

  那么下面我们来看代码:

  void changePointer(char **c)
  {
    *c = 100;//这个改变的是a地址的指向,而不是在其空间上赋值,因为此时还没有为a分配空间,或者说这个空间只能读不能写入,这个空间连void 类型都算不上;我个人是这么理解的
    //想要改变a所指向空间的数值的话需要,为其分配内存空间,然后通过指针改变;即是通过 c[x][y] 或者直接操作内存块 *c来改变,但是一定要分配有内存空间
  }

  void changePointer_2(char *d)
  {
    d = 200;//在这里改变的是d指向的地址,和a无关
  }

  void main()
  {
    char *a = NULL;
    char **b = NULL;

    b = &a;//如同基本数据类型取地址可赋给一级指针;所以一级指针取地址可以赋给二级指针
    //倘若想改变a 指向的地址 可以通过*b来改变

    *b = 0x111;//当然也可以直接改变 a = 0xaaa//这里我用的是vs2010 它的地址格式好像就是这样的 也可以直接取数值比如两个函数那样

    //然后我们通过函数来改变地址
    changePointer(&a);
    printf("%d\n",a);//打印出地址为100

    //这个时候肯定会有人想用一级指针改变地址,那么我们来实验一下
    changePointer_2(a);//因为是一级指针,就像是基本变量之间的数值传递不用取地址;就像是int a; int b; a = b;一样
    printf("%d\n",a);//我们发现打印出的地址还是100
    //这个地址并没有随着d的变化而变化


    system("pause");


  }

  我们可以发现一级指针取地址可以赋给二级指针,于是二级指针就诞生了;

  那么我们来看看这段程序是如何运行的,其实这个昨天0级指针到一级指针的运行差不多:

  首先main()函数 a 和 b 都入栈;然后运行到changePointer(&a)时,将地址传递过去,子函数changePointer开辟新的栈空间,二级指针c入栈,这时候c指向的是main函数中a的地址,它操作的就是a变量的空间,所以它可以直接改变指针a 的指向;所以说函数运行完被析构掉之后(c也被析构掉),但是已经通过c改变a 的地址

  然后运行到changePointer_2(a),这时将地址传递过去,这时候d入栈,d指向a的空间;这里只是单纯的指向a 的地址,不可以像二级指针那样可以改变a指向的空间;由于他们是不同的变量,所以改变d的指向后,完全不会改变a的指向(就像int a  把数值赋给int b一样,改变b的值不会影响a 的数值),也就是说就算你把 d 的地址指向改变的天翻地覆,也和a没有半毛钱关系;

  这个就是我对二级指针的见解;关于如何向一级指针所指的空间中赋值,我会在以后的随笔中发表我的看法;

  

posted @ 2017-09-22 20:44  SmartGame  阅读(3898)  评论(0编辑  收藏  举报