二级指针与二维数组
先看一道笔试题:
#include<stdio.h>
void func1(int **a)
{
printf("a[0][1]=%d
",a[0][0]);//
printf("a[0][1]=%d
",a[0][1]);//
printf("a[0][1]=%d
",a[1][0]);//
printf("a[0][1]=%d
",a[1][1]);//
}
void func2(int *a)
{
printf("a[0][1]=%d
",a[0]);//
printf("a[0][1]=%d
",a[1]);//
printf("a[0][1]=%d
",a[2]);//
printf("a[0][1]=%d
",a[3]);//
}
int main()
{
int a[2][2] = {0, 1, 2, 3};
func1(a);
printf("
");
func2(a);
return 0;
}
程序能正常输出吗?输出多少?
实际上放到IDE中运行一下可知,编译可以通过(尽管有警告),但运行出错,这又是为何呢?
要回答这道题,我们首先得明确什么是二级指针:即指向指针变量的指针;
示例如下:
#include<stdio.h>
int main()
{
int a=5;
int *p=&a;
int **pp=&p;//此为二级指针
printf("a=%d
",a);
printf("*p=%d
",*p);
printf("p=%d
",(int)p);
printf("**pp=%d
",**pp);
printf("*pp=%d
",(int)*pp);
printf("pp=%d
",(int)pp);
return 0;
}运行结果如下:
其次是对二维数组概念的掌握:
例如对于二维数组a[3][4],应注意的是用矩阵表示二维数组是逻辑上的概念,能形象的地表示出行列关系。而在内存中,各元素是连续存放的,地址不是二维的,而是线性的。
如下图所示:
因此二维数组并不能等同于二级指针,由定义可知反而可以当成一维数组对待。此时再回过头来看那道笔试题;
当把二维数组名a作为实参传入func1时,传进去的只不过是二维数组元素的首地址(结合上图加以体会);此时指针实则已经退化成一级指针了,即二维数组被当成了一维数组对待(因为二维数组地址本身是线性的,要想当成矩阵来使用,必须知道数组的列元素个数,但列信息并没有传入给func1);所以此时想按照二维数组的方式输出原数组的内容是不可能的,因为列信息丢失了,但如果按照一维数组输出就是可以的:
#include<stdio.h>
void func1(int **a)
{
printf("a[0][1]=%d
",a[0]);//
printf("a[0][1]=%d
",a[1]);//
printf("a[0][1]=%d
",a[2]);//
printf("a[0][1]=%d
",a[3]);//
}
void func2(int *a)
{
printf("a[0][1]=%d
",a[0]);//
printf("a[0][1]=%d
",a[1]);//
printf("a[0][1]=%d
",a[2]);//
printf("a[0][1]=%d
",a[3]);//
}
int main()
{
int a[2][2] = {0, 1, 2, 3};
func1(a);
printf("
");
func2(a);
return 0;
}那么如果我仍希望可以按照二维数组输出呢?由上述分析可知,只需传入带有列元素信息的指针即可,此时需要用到指向一维数组的指针变量,这才是二维数组对应的指针形式,而不是二级指针。
#include<stdio.h>
void func1(int (*a)[2])
{
printf("a[0][1]=%d
",a[0][0]);//
printf("a[0][1]=%d
",a[0][1]);//
printf("a[0][1]=%d
",a[1][0]);//
printf("a[0][1]=%d
",a[1][1]);//
}
void func2(int *a)
{
printf("a[0][1]=%d
",a[0]);//
printf("a[0][1]=%d
",a[1]);//
printf("a[0][1]=%d
",a[2]);//
printf("a[0][1]=%d
",a[3]);//
}
int main()
{
int a[2][2] = {0, 1, 2, 3};
func1(a);
printf("
");
func2(a);
return 0;
}
运行结果如下:
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: C++_4种强制类型转换
- 下一篇: assert断言的使用说明
