指针数组和二级指针的关系


  说个题外话吧!因为水平有限的关系,总感觉自己写的并不是太好,很多地方写的还是很模糊,但是我还是会尽量把自己的见解写出来,因为去年我刚接触C的时候,光看理论就已经把我折磨的死去活来了,而且还有关于c的指针这方面,感觉自己都是崩溃的;不过好在有老哥的帮助,总算是稍微入门了些,所以我也很清楚,光知道理论却不知道怎么用的心情到底是怎么样的,所以希望我的见解可以帮到大家,因为最近开始学习C++所以对于C都有些疏漏了,所以写这个也是希望可以复习一下以前的知识;

  指针数组:指针数组里储存的都是指针变量;

  形式 :数据类型 * 数组名称[数组长度]

  如同定义的那样,数组里储存的都是指针;

  #include

  #include

  #include

  int main()

  char *a[30];//建立一个指针数组,然后建立两个一级指针

  char *b;

  char *c;

  a[1] = b;

  a[2] = c;

  b[0] = (char *)malloc(64);
  b[1] = (char *)malloc(124);

  strcpy(b[0],"aaa");
  strcpy(b[1],"bbb");

  printf("%s\n",b);//打印出 aaa

  printf("%s\n",c);//打印出 bbb

  return 0;

  我们可以发现可以通过指针数组给一级指针分配内存空间,并且操控一级指针的空间,这个效果就和二级指针一样;

  char **a;

  char *b;

  a =&b;

  *a = (char *)malloc(sizeof(char)*64);

  于是我们可不可将指针数组的首地址传递给二级指针呢?

  char *a[30];//建立一个指针数组,然后建立两个一级指针

  char *b;

  char *c;

  char **d;//建立一个二级指针

  int i = 0;

   b= (char *)malloc(64);
  c = (char *)malloc(64);

  a[0] = b;

  a[21 = c;

  strcpy(b[0],"aaa");
  strcpy(b[1],"bbb");

  d = b;//将数组b的头地址赋给d

  for(i = 0;i < 4 ;i++)

    printf('%s\n",*(d+i))//我们可以发现 aaa 和 bbb被打印出来

  我们发现把指针数组的地址传递给二级指针后同样可以操作一级指针的内存空间;d = b 这里大家可能有疑问,不知道具体意思,我们知道数组的地址和它的首地址是一样的,即b即使数组的首地址,这个首地址里储存的就是一级指针的地址,于是我们将指针数组指针赋给了二级指针之后,通过*(d+0)或者d[0]可以取出储存在里面的地址,即是一级指针的地址,然后通过一级指针操控内存空间;