数组指针与指针数组
指出:[ ]的优先级比*高,两种区别在于先形成数组还是先形成指针,先形成数组为指针数组。
数组指针(行指针)
(占有内存中一个指针的存储空间,数组名的指针,即数组首元素地址的指针,本质是指针)
定义:int (*p)[10]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
指针数组
(占有多个指针的存储空间,本质是元素为指针的数组)
定义:int *p[n], 是具有n个指针类型的元素的数组,p[0]、p[1]、p[2]代表存放变量的地址(指针变量),需要分别赋值。将二维数组赋值给指针数组:for(i=0;i<3;i++) p[i]=arr[i];
注意:32位系统下,任何类型的指针都是占4个字节
测试
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned char i=0,j=0;
char array[3][3] = {{11,22,33},{44,55,66},{77,88,99}};
char *p[3] = {array[0],array[1],array[2]}; //定义指针数组 p:数组名/第一个指针首地址 *p:第一个指针 **p:第一个指针指向的元素,即11
char (*pp)[3] = array; //定义数组指针 pp:行指针 *pp:经测试仍为指针 **pp:指向行的首元素
//测试指针数组
printf("%d\n",array[i][j]); // = 11
printf("%d\n",**p); // = 11
printf("\n");
printf("%d\n",*(*p+1)); // = 22
printf("%d\n",*(p[0]+1)); // = 22
printf("%d\n",*(p[0])+1); // = 12 //+1没有包含在括号内, 没有起到选择的效果
printf("\n");
printf("%d\n",**(p+1)); // = 44
printf("%d\n",**(array+1)); // = 44
printf("%d\n",*p[1]); // = 44
printf("%d\n",array[1][0]); // = 44
printf("\n");
printf("%d\n",*((*p+2)+2)); // = 55 //注意不要与数组指针混淆,指针数组的每个元素本质是ElemType型的指针,++每次移动sizeof(ElemType)长度
printf("%d\n",*((*p+3)+2)); // = 66
printf("%d\n",*((*p+2)+3)); // = 66
printf("%d\n",*(*p+5)); // = 66
printf("%d\n",(*p+2)[3]); // = 66
printf("%d\n",(*p+3)[2]); // = 66
printf("%d\n",(*p)[5]); // = 66 //
printf("%d\n",*(*p+5)); // = 66
printf("\n");
printf("%d\n",p[2][2]); // = 99
printf("%d\n",*(*(p+2)+2)); // = 99
printf("\n");
//测试数组指针
printf("\n");
printf("%d\n",**pp); // = 11
printf("%d\n",**(pp+1)); // = 44
printf("%d\n",*(*pp+1)); // = 22
printf("%d\n",*pp); // = 6487552 为地址
printf("%d\n",pp); // = 6487552 为地址
}