昨天写了关于一级指针的见解,即二级数组的用法和二级指针差不多,关于数组指针和指针数组这两个是不同的概念,这一点我们一定要清楚;

  数组指针我们可以理解为指向数组的指针,就是一个指针;

  指针数组则可以理解为数组里存的是指针,即每个储存空间上储存的是指针变量;这里储存了多个指针

  一个数组可以这样定义 char a[3];分配了3个字节的内存

  二维数组可以这样定义 char b[3][3];分配了3*3 即9个字节的内存

  我们知道一维数组和一级指针的用法差不多,那么二级指针有和二级指针有什么关系呢?

{
  char a[3][3];定义一个二维数组
  //二维数组我们可以理解为它是由一维数组组成,比如这个二维数组可以看成是由三个一维数组构成,而每个一维数组里分配了三个字节的空间
  //每个一维数组都分配了一个头地址a[0]是第一个数组的地址,a[1]是第二个a[2]是第三个,下标是从0开始的;
  int i = 0;
  char b[3];//定义一个一维数组
  char *c;//定义一个一级指针
  //我们知道可以直接将数组的头地址直接赋给一级指针,那么我们可不可以也将二维数组的头地址赋给一个指针呢?于是便有了数组指针,即指向数组的指针
  char *d[3];//定义一个数组指针,指针指向的空间只有3个字节,这是一个二级指针
  c = b;//将指针指向一维数组
  d = a;//将数组指针指向二维数组
  printf("%d\n",sizeof(*d));//算出b所指向空间所分配的内存大小即3和数组指针的分配有关,如char *d[5] 则为5
  //我们可以通过指针往数组里copy数据
  for(i = 0 ; i  < 3 ; i++)
  {
    strcpy((b+i),"aa");
  }
 
//通过指针来
  for(i = 0 ; i < 3; i++)
  {
    printf("%s\n",(b+i));//b+i 每次会向后移动三个字节
  } 
 
//通过数组来
for(i = 0 ; i < 3; i++)
  {
    printf("%s\n",a[i]);//a[i] 每次会向后移动三个字节
  } 
  
}

  写到这里我想大家应该可以明白二维数组是可以用二级指针来表示的;当然这里我们还是不明白为什么二维数组可以和二级指针的用法 一样,这一点我们以后再说,总之现在我们可以了解二维数组可以像二级指针一样使用,它们的用法是差不多的;