(一)二维数组&&指针数组与数组指针

一、首先我们从字面意思理解一下什么是指针数组什么是数组指针
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. ", a[1][3]);
    printf("a[1][3] = %d. ", *(*(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. ", *(*(p3+0)+3));
    printf("a[1][4] = %d. ", *(*(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. ", *(p4+4));
    int *p6 = a[1];
    printf("a[1][1] = %d. ", *(p6+1)); // 指向二维数组的第二维
    return 0;
     }
原文地址:https://www.cnblogs.com/zhangshenghui/p/5327924.html