指针数组的定义形式:
类型名 * 数组名[数组长度];
如:
int *p[a];
数组指针的定义形式:
类型名 (* 指针名)[数组长度];
int (*p)[a];
指针数组,因为优先级的关系,所以p先与[]结合,说明p是一个数组,然后再与*结合说明数组p的元素是指向整形数据的指针。元素分别为p[0],p[1],….,相当于定义了8个整型指针变量。用于存放地址单元,在此,p就是数组元素为指针的数组,本质为数组。
数组指针,p先与*结合,形成一个指针,该指针指向的是有8个整型元素数组,p即为指向数组首元素地址的指针,其本质为指针。
举例说明:
int
main(
int
argc,
const
char
* argv[]) {
int arr[4][4] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int
(*p1)[4];
int *p2[4];
int i,j,k;
p1 = arr;
printf ( " 使用数组指针的方式访问二位数组 arr\n" );
for (i=0; i<4; i++) {
for (j=0; j<4; j++) {
printf ( "arr[%d][%d] = %d\t" ,i,j,*(*(p1+i)+j));
}
printf ( "\n" );
}
int *p2[4];
int i,j,k;
p1 = arr;
printf ( " 使用数组指针的方式访问二位数组 arr\n" );
for (i=0; i<4; i++) {
for (j=0; j<4; j++) {
printf ( "arr[%d][%d] = %d\t" ,i,j,*(*(p1+i)+j));
}
printf ( "\n" );
}
printf
(
"\n
使用指针数组的方式访问二位数组
arr\n
”
);
for
(k=0; k<4; k++) p2[k] = arr[k];
for (i=0; i<4; i++) {
for (j=0; j<4; j++) {
printf ( "arr[%d][%d] = %d\t" ,i,j,*(p2[i]+j));
}
printf ( "\n" );
for (i=0; i<4; i++) {
for (j=0; j<4; j++) {
printf ( "arr[%d][%d] = %d\t" ,i,j,*(p2[i]+j));
}
printf ( "\n" );
}
return
0;
}
运行结果:
使用数组指针的方式访问二位数组
arr
arr[0][0] = 0 arr[0][1] = 1 arr[0][2] = 2 arr[0][3] = 3
arr[1][0] = 4 arr[1][1] = 5 arr[1][2] = 6 arr[1][3] = 7
arr[2][0] = 8 arr[2][1] = 9 arr[2][2] = 10 arr[2][3] = 11
arr[3][0] = 12 arr[3][1] = 13 arr[3][2] = 14 arr[3][3] = 15
使用指针数组的方式访问二位数组 arr
arr[0][0] = 0 arr[0][1] = 1 arr[0][2] = 2 arr[0][3] = 3
arr[1][0] = 4 arr[1][1] = 5 arr[1][2] = 6 arr[1][3] = 7
arr[2][0] = 8 arr[2][1] = 9 arr[2][2] = 10 arr[2][3] = 11
arr[3][0] = 12 arr[3][1] = 13 arr[3][2] = 14 arr[3][3] = 15
arr[0][0] = 0 arr[0][1] = 1 arr[0][2] = 2 arr[0][3] = 3
arr[1][0] = 4 arr[1][1] = 5 arr[1][2] = 6 arr[1][3] = 7
arr[2][0] = 8 arr[2][1] = 9 arr[2][2] = 10 arr[2][3] = 11
arr[3][0] = 12 arr[3][1] = 13 arr[3][2] = 14 arr[3][3] = 15
使用指针数组的方式访问二位数组 arr
arr[0][0] = 0 arr[0][1] = 1 arr[0][2] = 2 arr[0][3] = 3
arr[1][0] = 4 arr[1][1] = 5 arr[1][2] = 6 arr[1][3] = 7
arr[2][0] = 8 arr[2][1] = 9 arr[2][2] = 10 arr[2][3] = 11
arr[3][0] = 12 arr[3][1] = 13 arr[3][2] = 14 arr[3][3] = 15
数组指针:
i代表行,j代表列。*(p1+i)代表指向第i行首地址的指针地址,所以*(p1+i)+j代表指向第i行第j列指针地址。用取地址符*取值,*(
*(p1+i)+j
)代表该指针地址对应的内容。
指针数组:
i代表行,j代表列。
p2[i]代表指向第i行的首地址的指针地址,所以p2[i]+j代表指向第i行第j列的指针地址,用取地址符*取值,*(
p2[i]+j
)代表该指针地址对应的内容。