先上两个企图用数组指针输出数组的代码:
//代码1:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print(int (*p)[4]);
int main(void)
{
int a[3][4];
int(*p)[4] = a;
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
scanf("%d", *(p + i) + j);
}
}
print(a);
return 0;
}
void print(int(*p)[4])
{
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%d ", *(*(p + i) + j));
}
printf("\n");
}
}
输入:1 1 1 1 2 2 2 2 3 3 3 3
输出:1 1 1 1
2 2 2 2
3 3 3 3
//代码:2:
#include <stdio.h>
int main(void)
{
int a[5] = { 1, 2, 3, 4, 5 };
int(*p)[5] = &a;
int i;
for (i = 0; i < 5; i++)
{
printf("%d\n", *(p + i));
}
return 0;
}
输出:1274935144
1274935164
1274935184
1274935204
1274935224
总结:两个代码都是初始化数组并输出,但代码1可以正常运行 代码2不行。由此我们可以
得出结论:
数组指针一般形式为: 类型 (*p)[n];
数组指针是指向数组的指针,指针可以指向二维数组的某一行,但不可以指向
数组的某一个。 p指向二维数组某一行时n必须为列数,指向一维数组时必须为
数组元素个数。这也就是为什么代码2不行的原因。
但如果把代码2中的n改为5,那输出时结果为:
1274935144
1274935164
1274935184
1274935204
1274935224
可以看到这些都是地址并且相差20,这是因为数组指针实际上是个二级指针因此
p+i会直接跳过i个一维数组的内存,也正因为是二级指针,因此初始化时要用&a
而不是a。如果用*(*(p)+i)就可以了,但是输出一维数组没有这个必要搞这么复杂