一、定义
指针数组:存放指针的数组,即数组里面的每个元素都是一个指针。语法定义:int *p1[10](由于[]的优先级高于*的优先级,所以先结合为数组,然后再结合为一个指针)如图一所示。
数组指针:一个指向数组的指针。语法定义:int (*p2)[10](由于()的优先级高于[]的优先级,所以先结合为指针,然后再结合为一个数组)如图一所示。
综上,可以简记为什么在后面,它就是什么类型。
?图一 指针数组与数组指针
二、使用
?2.1数组指针的运算
?由于指针指向的是一个地址,因此数组指针也同样可以进行相关运算;例如指针的加减可以实现指针指向数组上一个或者下一个元素的功能。如图二所示。
?图二 数组指针的加法运算
2.2 指针数组的运算和赋值
如图三所示,通过观察内存情况可知,指针数组+1时,只跳过一个元素的大小。
图三 指针数组的运算
2.3 数组指针的遍历
如图四、五所示,为数组指针的遍历。
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[]={1,2,3,4,5};
int (*p)[5];
p=&a;
printf("%d",*(*p+3));
return 0;
}
图四 数组指针的遍历
图四 数组指针的遍历
2.4 用指针数组对二维数组进行遍历
#include <stdio.h>
int main(int argc, char *argv[])
{
// 二维数组与指针的结合使用
int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
int (*p1)[5]; // 数组指针
p1 = a; // 等同 p1 = &a[0]; // 指向二维数组的数组名
printf("a[0][2] = %d.\n", *(*(p1+0)+2)); // a[0][2] = 3
printf("a[1][2] = %d.\n", *(*(p1+1)+2)); // a[1][2] = 8
return 0;
}
图五 二维数组与数组指针的结合
关于二维数组的相关符号,解释如图六所示。
#include <stdio.h>
int main(int argc, char *argv[])
{
/*
二维数组的几个符号的测试
1、a等同于&a[0]
2、a[0]等同于&a[0][0]
3、在数值上 a、&a、a[0]、&a[0]、&a[0][0] 是相等的,但是在类型上面是有区别的。
*/
int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
printf("a = %p.\n", a); // a 类型是 int (*)[5]
printf("&a = %p.\n", &a); // &a 类型是 int (*)[2][5]
printf("a[0] = %p.\n", a[0]); // a[0] 类型是 int *
printf("&a[0] = %p.\n", &a[0]); // &a[0] 类型是 int (*)[5]
printf("a[0][0] = %d.\n", a[0][0]); // a[0][0] 类型是 int
printf("&a[0][0] = %p.\n", &a[0][0]); // &a[0][0]类型是 int *
}
图六 二维数组相关符号
|