从一级指针到二级指针

  昨天,写了一些关于一级指针的看法,那么此次咱们再来看看二级指针的一些用法,也能够说是我本身的一些看法
  所谓二级指针其实和一级指针差很少,一级指针是存储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");void


  }

  咱们能够发现一级指针取地址能够赋给二级指针,因而二级指针就诞生了;

  那么咱们来看看这段程序是如何运行的,其实这个昨天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没有半毛钱关系;

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

相关文章
相关标签/搜索