数组指针的⽤法
int *a[4]; //指针数组
指针数组就相当于⼀次声明了多个指针。数组的每⼀个元素都是⼀个指针。很好理解,下⾯主要看数组指针
int (*p)[4]; //数组指针
数组指针就相当于⼀次声明了⼀个指针。只不过这个指针指向很特别,是⼀个数组。
[]优先级⼤于*,故数组指针声明时要加()。
例1:
#include<stdio.h>
#include<stdlib.h>
void main()
{
//数组指针的⽤法,⽤处。
int b[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int (*p)[4]; //该语句是定义⼀个数组指针,指针步长为4个int即16位。
//int *p2=&b;
p=&b;
int i=0;
while(i<16)
{
printf("%d\t",(*p)[i]);
//printf("%d\t",*p2++);
i++;
}
}
printf("%d\t",(*p)[i]);遍历输出数组b;
数组指针就相当于舞王僵⼫⼀样,带了⼩弟,n就是⼩弟的个数,通过下标值能直接访问到具体哪⼀个⼩弟,即数组⾥哪⼀个数
数组指针下标⾃增(i++)的时候,指针指向不变。
这⾥直接⽤整形指针就可实现,⽽且更⽅便简洁。见上⾯被注释部分。
例2:把例1的while()语句替换。
while(i<4)
{
printf("%d\t",(*p++)[0]);
i++;
}
例2输出1 5 9 13,相当于指针⼀次移动了4个int.16个字节。
数组指针⾃增(*p++)时,指针指向移动sizeof(类型)。
其实上句在其他类型指针也适⽤。
如int *p;
//指针指向了int,就是整型指针,整型指针有啥特点?就是能保存整形变量的地址。有啥⽤途?就是p++的时候能指向下⼀个int型数。所以了?经常⽤指针指向⼀个数组。因为他们都是int型的,所以推导出步长了?整型指针的步长为sizeof(int),即4字节
//同理可以得出什么float型指针,char型指针什么的。。。
指针与二维数组同理就得出了数组指针,特点?保存数组⾸地址。⽤途?p++的时候能指向下⼀个数组。所以了?要⽤它来指向⼀个⼆维数组。因为⼆维数组⾥的每⼀个元素都是相同类型的(都是⼀个int型数组),所以推导出步长了?sizeof(int[4]),即16
//说⽩了就⼀指针,指向了数组类型
例3:数组指针指向⼆维数组。
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a[3][4]={{1,2,3,4},{11,12,13,14},{21,22,23,24}};
int (*p)[4]; //该语句是定义⼀个数组指针,指针步长为4个int即16位。
p=&a;
int i=0;
while(i<3)
{
/
/printf("%d\t",(*p)[i]);
//数组指针,指向的是⼀个数组整体,相当于指针也带了下标,当执⾏i++操作时,下标+1,得到该数组的下⼀个元素,
//在该例中,指针没有位移,所以依次输出为1 2 3
printf("%d\t",(*p++)[0]);
//整型数组类型的指针,指向的是⼀个数组整体,当执⾏*p++操作时,指针位移该数组长度的位数
//在该例中,即指针位移4个int的长度,所以输出是1 11 21
i++;
}
}
通过例3就能够很明显的看出数组指针下标⾃增与本⾝⾃增的区别了。
我记得以前⽼师说过:能⽤⼀维数组就尽量不要⽤⼆维数组。我想说的是:能⽤指针实现的尽量不要⽤数组指针。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。