数组的分类:
常见的数组有一维数组及二维数组,
a[100] ,a[100][100]。前者是一维数组,表示有100个储存位,类似于数轴的X轴。后者是二维数组,表示有100X100个储存位,类似于平面数轴XY。
数组于指针的关系
数组用来储存多个数值或字符,貌似和指针并无联系,但数组其实就是一个默认的常量指针。
例如数组int a[100],它就相当于int *const a;其中a的初值是a[0]的地址,a=&a[0];数组名就是数组的首地址。
对于数组中依次输出a[0],a[1]。。。a[i],就相当于指针&a[i]=a+i;就是首地址移动到i个元素地址。对于a[i]的值,我们同样可以用指针a 来表示:a[i]=*(a+i);
实例演示
int a[5]={5,2,1,0,0};
int *p=a;
int *constp1=a;
for(i=0;i<5;i++)
{
printf(“%d”,a[i]);
printf(“%d”,*(a+i));
printf(“%d”,*(p+i));
printf(“%d”,*(p1+i));
}
对于以上四种输出,显然他们的输出都是52100,得证a[i]可以用*(a+i)表示,数组名a是一个指针,而且是一个常量指针;
指针数组与数组指针
int *a[10]; //指针数组,是数组,存放有10个指针的数组,可以用指针来表示这个指针数组(指针的指针)
int (*a)[10]; //数组指针,是指针,是指向每行10个元素的指针,例如((*a)[10]={0}),a就是这十个数据所在数组的头地址。
二维数组与一维数组指针用法的区别:
首先,定义一个一维数组和一个二维数组
int a1[10];
int a2[5][10];
int (*p)[10];//指向每行十个元素的指针
a1=int *p;//指向a1的头地址a[0];
&a1=int (*p)[10]; //指向a1 这个数组
a2= int(*p)[10]; //指向二维数组a2的一行;
&a2=int (*p)[5][10]; //指向a2这个二维数组
有 &a1和a2是等价的,都表示指向一个有是个数据的数组(或数组的一行)
P=&a1;
P=a2;
**一维数组和二维数组的指针加减法同样存在差异***