数组指针:指向多个数组的指针,本质是指针。
一、定义:
存储类型 数据类型 (*变量名)[数组大小] int (*p)[5]
二、初始化:
int arr[3][2]={1,2,3,4,5,6};
int (*p)[2]=arr; //数组名是一个地址
p[0][0] //表示取p数组的第一个元素ch1数组的第一个元素,即取'h'。
=*(p[0]+0) //p[0]地址偏移0个数据单位,并对其取值
=(*(p+0))[0] //p(首地址)偏移0个数据单位,得到ch1的地址对其下标[0]进行取值
=*((*(p+0))+0) //p(首地址)偏移0个数据单位并取值得到ch1的地址,再偏移0个数据单位并取值,得到ch1的第一个元素,即'h'。
总结:对于数组指针取值,p[][]
1:每去除一个[],就要加一个*进行取值。
2:[]里的值变成+该值,表示地址偏移。
3:由于[]的优先级高于*,所以需要用()确保优先级不改变。
4:*和+虽然属于同一优先级,但其执行顺序是从右到左,所以也需要加()保证运算顺序。
小tip:当拿不准优先级或执行顺序时,可以按照逻辑顺序逐步加()保证执行顺序。
三、数组指针与二维数组之间的关系:
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4]=arr //={arr[0],arr[1],arr[2]}; //等价于p[0]是arr[0][0]的地址,p[1]是arr[1][0]的地址,p[2]是arr[2][0]的地址
注意:int *p[4]的中的4表示p++一次偏移4个数据单位,因此指针数组操作二维数组时,[]中的数字为二维数组的列数。因此,数组指针又叫行指针。
例1:给定一个二维数组char arr[3][10]={"Liu","LOVE","Song"},定义一个数组指针将二维数组中所有大写改为小写,小写改为大写。
{
char arr[3][10]={"Liu","LOVE","Song"};
char (*p)[10]=arr; //=char (*p)[10]={arr[0],arr[1],arr[2]};
for(int i=0;i<3;i++) //遍历行
{
for(int j=0;j<10;j++) //遍历列
{
//方式一:用数组下标的方式访问
if('A'<p[i][j]&&p[i][j]<'Z') //判断是否为大写
p[i][j]+=32; //等价于p[i][j]=p[i][j]+32; //转换为Ascii码中小写,两者相差32
else
p[i][j]-=32; //p[i][j]=p[i][j]-32; //转换为大写
//方式二:用地址偏移的方式访问
if('A'<*(p[i]+j)&&*(p[i]+j)<'Z') //等价于(*(p+i))[j] //等价于*((*(p+i))+j)
*(p[i]+j)+=32;
else
*(p[i]+j)-=32;
}
}
}
指针数组:存放多个指针的数组,本质是数组。
一、定义:
存储类型 数据类型 *数组名[数组大小] eg:int *p[5]
二、初始化:
char ch1[] = "hello";//char *//&ch1 == char (*)[6]
char ch2[] = "world";
char * p[2]= {ch1,ch2};