一维数组与指针,二维数组与指针,指针数组及数组指针的概念详解、实例解析

概念详解:

指针:指针与“int a”,“float b”一样,也是一种变量,只是指针变量中存储的是内存单元的地址,这是与“int a”和“float b”的本质区别,C语言的精华就在于指针、结构体和链表。

一维数组:定义一维数组之后,即在内存中分配一段连续的地址空间,如C语言中,int num[5],在32位系统中,int占据4个字节,现假设num[0]的地址空间为0x00000004,那么num[1]的地址空间即为0x00000008 (0x00000004 + 4),num[2]的地址空间即为0x0000000c,其余几个的地址空间依次类推,加4即可。

二维数组:二维数组其实可以看成是一个矩阵,如C语言中,int a[3][4],即可以看成是一个3行4列的矩阵,在内存中每一个位置存储一个数据,用a[i][j]表示。

指针数组:数组元素全为指针的数组称为指针数组,如C语言中,定义一个指针数组用int  *arr[5],本质是一个数组,只是每个数组中的内容是变量的地址,而不是变量本身。

数组指针:通常用来指向二维数组的指针叫数组指针,如C语言中,int (*p)[5] , 可以用p来指向二维数组。

实例解析:

1、一维数组与指针

定义一个一维数组int data[5]={2, 5, 6, 9, 8};,定义一个指针int *p;,一维数组本质上可以用指针来处理;

    如以下程序:

   int data[5]={2, 5, 6, 9, 8};  //数组名“data”即为数组第0个元素的首地址

   int *p, k;

   p = data;

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

 {

    printf("%d\n", *(p+k));  //*(p+k)即表示数组中第k个元素的数值,也可用*(data+k)来表示,(p+k)或者(data+k)表示第k个                                                                                                                                                                        元素的内存地址

 }

2、二维数组与数组指针

     定义一个二维数组int num[3][4], 定义一个数组指针int (*p)[3]

     二维数组可以看成是多个一维数组的组合,在这个定义中,数据存储方式是三行四列,即每行有四个元素,共计三行。每行可以看做是一个一维数组,而且每个一维数组的首地址是num[0], num[1], num[2], 整个二维数组的首地址是数组名num,也是num[0][0]的地址。

     以下程序为上述概念的解释:

      int num[3][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

      int (*p)[3];

      int m, n;

      p = num;

      for(m=0; m<3; m++)

     {

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

        {

             printf("%d\n",  *( *(p + m) + n) );

            //这句代码中,最里边的*(p + m) + n,比如现在是*(p + 1) + 1,p指向了第0行元素,p+1即指向第一行数据,*(p + 1)指向第一行的数据,在实际代码这句代码转化成了第一行第0个元素地址,因为使用整行数据是没有含义的,编译器遇到此类情况时,都会转化成第0个元素的地址,那么*(p + 1) + n就指向了第一行第n个元素的内存地址,那么* ( *(p + m) + n) 就是取出第一行第n个元素的值

        }

     }

  这是一种利用指针取二维数组每个元素的方法,下面介绍第二种方法:

  int num[3][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

  int m, n;

  for(m=0; m<3; m++)

  {

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

    {

        printf("%d\n",*  ( num[m] + n ) );

       //num[0], num[1], num[2], 表示每行元素的首地址,而num[m] + n表示第m行第n列元素的地址,用取值符*,即*  ( num[m] + n )打印出每个位置的数值

    }

  }

3、指针数组

   指针数组本质是一个数组,只不过每个元素的内容存储的是变量的内存地址。

   如程序;

  int  a[3]= {1, 2, 3};

  int  *p[3];

  int m;

  for(m=0; m<3; m++)

{

    p[m] = a + m;

}

for(m=0; m<3; m++)

{

   printf("%d\n", *p[m]);  //用取值符打印出数组中每个元素的数值

}








  • 6
    点赞
  • 1
    评论
  • 12
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值