一、首先我们从字面意思理解一下什么是指针数组什么是数组指针
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;
}
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;
}