C专家编程 第9章 再论数组 9.6 C语言的多维数组

    C语言的多维数组
    ANSI C标准表示:
    当几个“[]”修饰符连续出现时(方括号里面是数组的范围),就是定义一个多维数组。

    但所有其他语言都把这称为“数组的数组”
    哪些人的意思是C语言没有像其他语言那样的多维数组。

    在不同的语言中,“多维数组”的含义各有什么不同
    Ada语言标准明确说明数组的数组和多维数组是不一样的。
    Pascal语言标准明确说明数组的数组和多维数组是一样的。
    C语言里面只有一种别的语言称为数组的数组的形式,但C语言称它为多维数组。(哈哈)

    C语言的方法多少有点独特:定义和引用多维数组的唯一方式就是使用数组的数组。尽管C语言把数组的数组当做是多维数组,但不能把几个下标范围如[i][j][k]合并成Pascal式的下标表达式风格如[i,j,k]。如果你清楚地明白自己在做什么,也介意产生不合规范的程序,可以把[i][j][k]这样的下标值计算为相应的偏移量,然后只用一个单一的下标[z]来引用数组。当然,这不是一种值得推荐的做法。同样糟糕的是,像[i,j,k]这样的下标形式(由逗号分隔)是C语言合法的表达形式,只是它并非同时引用这几个下标(它实际上所引用的下标值是k,也是就逗号表达式的值)。C语言支持其他语言中一般称作“数组的数组”的内容,但却称它为多维数组。

    在C语言中,可以像下面这样声明一个10*20的多维字符数组:
    char carrot[10][20];
    或者声明一种看上去更像“数组的数组”形式:
    typedef char vegetable[20];
    vegetable carrot[10];
    不论那种情况,访问单个字符都是通过carrot[i][j]的形式,编译器在编译时会把它解析为*(*(carrot + i) + j)的形式。

    但C语言实际上只支持“数组的数组”。如果你的思维模式可以把数组看做是一种向量(即某种对象的一维数组,它的元素可以是另一个数组),就能极大简化编程语言中的这个相当复杂的领域。

    C语言中的数组就是一维数组
    当提到C语言中的数组时,就把它看做是一种向量(vector),也就是某种对象的一维数组,数组的元素可以是另一个数组。

    如何分解多维数组
    我们声明如下的多维数组:
    int apricot[2][3][5];
    int (*p)[3][5] = apricot;
    int (*r)[5] = apricot[i];
    int *t = apricot[i][j];
    int u = apricot[i][j][k];
    正常情况下,赋值发生在两个相同的类型之间,可以看到在“数组的数组的数组”中,每一个单独的数组都可以看作是一个指针。这是因为在表达式中的数组名被编译器当做“指向数组第一个单元的指针”。换句话说,不能把一个数组赋值给另一个数组,因为数组作为一个整体不能成为赋值的对象。之所以可以把数组名赋值给一个指针,就是因为这个“在表达式中的数组名被编译器当作一个指针”的规则。
    指针所指向的数组的维度不同,其区别会很大。使用上面例子中的声明:
    r++;
    t++;
    将会使r和t分别指向它们各自的下一个元素(两者所指向的元素本身都是数组)。它们所增长的步长是很不相同的,因为r所指向的数组元素的大小是t所指向的数组的元素大小的3倍。

    /*
    ** multi_array_code_2.c.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值