首页 > 编程语言 > 详细

二维数组&&指针数组与数组指针

时间:2016-03-28 10:17:54      阅读:251      评论:0      收藏:0      [点我收藏+]
一、首先我们从字面意思理解一下什么是指针数组什么是数组指针
1、指针数组:本质是一个数组,数组中的每一个元素是一个指针。
2、数组指针:本质是一个指针,而指针指向一个数组。
二、我们该怎么区分指针数组和数组指针?
1、总共有三种表示形式:int * P[4]和int (*P)[4]和int *(P[4]),表面看起来是不是很难区分?
      一般规律:int *P是一个指针,int P[4]是一个地址,因此我们在区分指针数组时首先要清楚你找的对象是谁(找核心),其次我们找谁与核心最先结合(找结合)。第三步         继续往外扩展,知道整个符号结合完毕。
2、找核心很容易,我们该怎么找结合呢?这个主要看的是优先级,在这里我们查看C语言符号优先级。
技术分享
技术分享
技术分享
  我们看到C语 言运算符中[ ]运算符优先级最高,其次是( ),再其次才是 * ,因此int *P[4],[ ]优先级最高,P先于[ ]结合,因此int *P[4]本质上是一个数组,其次P数组才会与*结合,因此我们就知道了int *P[4]是一个指针数组。而int (*P)[4]是一个数组指针,因为核心是P,P先于( )结合,其次才会与[ ]结合。以此类推int *(P[4]是一个指针数组),它与int *P[4]等价。
三、二维数组与指针
1、二维数组的定义:
      int Array_a [2][3]={1,2,3,4,5,6};或者int Array_a[2][3]={{1,2,3},{4,5,6}};
2、指针与数组的关系
      int Array_a[2][3]={1,2,3,4,5,6};我们有两种方法访问Array_a数组中的某个元素,比如我们访问第三个元素,Array_a[0][2]或者*(*(Array_a+0)+2)
      注意:Array_a、&Array_a[0]、Array_a的区别:
      #include <stdio.h>
      int main(void)
     {
    int a[2][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
    //int a[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    printf("a[1][3] = %d.\n", a[1][3]);
    printf("a[1][3] = %d.\n", *(*(a+1)+3));
    //int *p1 = a;// 类型不匹配
    //int **p2 = a;// 类型不匹配
    // 指针指向二维数组的数组名
    int (*p3)[5];  // 数组指针,指针指向一个数组,数组有5个int类型元素
    p3 = a;  // a是二维数组的数组名,作为右值表示二维数组第一维的数组
    // 的首元素首地址,等同于&a[0]
    p3 = &a[0];
    printf("a[0][3] = %d.\n", *(*(p3+0)+3));
    printf("a[1][4] = %d.\n", *(*(p3+1)+4));
    // 指针指向二维数组的第一维
    //int *p4 = &a[0];// 不可以
    int *p4 = a[0];// a[0]表示二维数组的第一维的第一个元素,相当于是
    // 第二维的整体数组的数组名。数组名又表示数组首元素
    // 首地址,因此a[0]等同于&a[0][0];
    int *p5 = &a[0][0];
    printf("a[0][4] = %d.\n", *(p4+4));
    int *p6 = a[1];
    printf("a[1][1] = %d.\n", *(p6+1)); // 指向二维数组的第二维
    return 0;
     }

二维数组&&指针数组与数组指针

原文:http://www.cnblogs.com/zhangshenghui/p/5327924.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!