关于指针数组和数组指针
要弄明白这两者的区别首先要知道()>[]>* 的优先级顺序。
1:数组指针本质上是一个指针,而且是一个指向数组的指针(又称为行指针),在这声明一下数组指针是指向二维数组的,对于一维数组数组没有任何意义。
而所谓的指针数组本质是一个数组,它的目的把相同类型的指针统一放在一个数组里,而且与数组指针不同的是:指针数组既可以用在一维数组中也可以用在二维数组中。
2:数组指针的声明方式为 int (*p)[3]
指针数组的声明方式为 int *p[3]
从声明方式就可以简单的区分数组指针和指针数组。
3:下面看看数组指针和指针数组的用法:
例如写一个c程序(数组指针)
#include <stdio.h>
int main(){
int a[2][3]={1,2,3,4,5,6}; //定义一个二维数组并且将数组初始化
int (*p)[3]; //定义一个数组指针p
int i;
p=a; //用指针指向这个二维数组(要注意这里的p指向的是每一行的地址所以p+1代表的是移动一行的地址,既把每一行看做是一个一维数组的话,就是移动一个一维数组的跨度)
printf("%d\n",**p);
printf("%d\n",**(p+1));
printf("%d\n",p[0][1]);
printf("%d\n",*(*p+2));
printf("%d\n",p[0][2]);
printf("%d\n",*(*(p+1)+2));
return 0;
}
运行结果如下:
1
4
2
3
3
6
由此可以看出在一个二维数组指针*(p+i)+j表示的是第i行第j列的地址*(*(p+i)+j)表示的是第i行第j列的元素。
关于指针数组的c程序
#include <stdio.h>
int main(){
int a[2][3]={1,2,3,4,5,6};
int *p[3]; //指针数组
int i;
for(i=0;i<2;i++){
p[i]=a[i];
}
printf("%d\n",p[0][1]);
printf("%d\n",**p);
printf("%d\n",*(*(p+1)+1) );
printf("%d\n",*(p[1]) );
return 0;
}
运行结果如下:
2
1
5
4
通过比对这两个函数的程序还有运行结果,我们发现其实在二维数组中每一个数组指针,实际上就是一个指针数组里的一个元素,既在二维数组中数组指正和指针数组一样,但是要注意的是指针数组不可以统一赋值。
如果下图看做是一个二维数组
A | B | C | \0 |
a | b | c | \0 |
若分别用指针数组和数组指针去声明则可以如下
数组指针 Char (*p)[4] 用p指向第一行p++就指向下一行;
指针数组 char *p[4] 则p[0]就指向第一行,p[1]就指向第二行;