牛骨文教育服务平台(让学习变的简单)
博文笔记

二级指针与二维数组

创建时间:2015-11-01 投稿人: 浏览次数:2878

先看一道笔试题:

#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;
}
运行结果如下:



声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。