打印

【讨论】从本质上理解C语言中的数组

[复制链接]
2345|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ohy3686|  楼主 | 2012-12-19 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ohy3686 于 2012-12-19 09:32 编辑

    在单片机C语言程序设计中,在通信和数据采集应用中,都离不数组。对于长数据帧的出来还需要数组和指针的融合应用。
    就本人的理解,数组和指针联系紧密,但有有所区别。

    1.在C语言中,对于一个数组,我们只能做两件事情:
        A. 确定该数组的大小(数组的大小必须在编译器就作为一个常数确定下来)
        B. 获得指向该数组下标为0的元素的指针。(其他的数组操作,实际上都是通过指针进行的)

    2. C语言中,数组的元素可以是任何类型的对象,也可以是另外一个数组。因此,二维数组实际上是元素为一维数组的一维数组。
    例如: int  a[12][31];
    该语句声明了一个数组,该数组拥有12个数组类型的元素;其中每个元素都是一个拥有31个整型元素的数组。

    3. 如果我们在应该出现指针的地方,采用数组名来替换,那么数组名就被当作指向该数组下表为0元素的指针
    例如:  int  *p;
                int  a[3];
                p = a;                //把数组a中下标为0的元素的地址赋值给p。
    如果写成p = &a;在C语言中是非法的,因为&a是一个指向数组的指针,而p是一个指向整形变量的指针,它们的类型不匹配。

    4.  如果一个指针指向的是一个数组中的元素,那么,给这个指针加1,就能得到指向数组下一个元素的指针。
    注意:给一个指针加上一个整数,与给该指针的二进制表示加上同样的整数,两者截然不同。
    例如:int  *p;  (假设int是4个字节,p指针的二进制表示为:0x00005611)
               p+2,指针指向的内存位置为:0x00005619
               二进制+2,指针指向内存为:0x00005613

    5. int  a[10];  
        *a = 8;就是将数组a中下标为0的元素的值设置为8。
        同理,*(a+1)就是对数组小标为1的元素的引用。
        以此类推,*(a+n)就是对数组a中下表我ii的元素的引用。这种用法相当常用,因此被简记为a[n]
        所以,实际上,a[n]  的本质是 *(a+n)。



相关帖子

沙发
airwill| | 2012-12-19 11:57 | 只看该作者
用数组, 在软件的安全性上, 是明显优于指针.
但通常会降低二进制代码执行效率(当然这一点,还依赖于指令系统).

使用特权

评论回复
板凳
ohy3686|  楼主 | 2012-12-19 12:01 | 只看该作者
airwill 发表于 2012-12-19 11:57
用数组, 在软件的安全性上, 是明显优于指针.
但通常会降低二进制代码执行效率(当然这一点,还依赖于指令系统 ...

嗯....是的,只要你一定义数组,编译器就会给数组分配相应的空间,不管你用还是不用。

使用特权

评论回复
地板
cool_coder| | 2012-12-19 15:57 | 只看该作者
没那么复杂,其实所谓数组就是给一段连续的存储区域起个名,再指定个数据类型,方便在高级语言的概念层次上管理而已;对于机器来说,只要知道这段存储区的起始地址和每个元素的存储格式就可以正确处理了。

使用特权

评论回复
5
hww5408| | 2014-6-20 22:49 | 只看该作者
其实,楼主对数组的本质理解,某种程度可以用指针互换,这也是许多人对数组一种理解,。。。。。
但指针与数组是不一样的,最明显的一个例子,指针就是存地址的变量,无论指向字符或整型或长整型,指针占用内存的空间都是固定不变的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:广东职业技术学院 欧浩源(ohy3686@foxmail.com)    [Zigbee技术&物联网应用] 群:168225322    [技术交流微信]:gzyohy (暗号:宝塔镇河妖)

322

主题

899

帖子

2962

粉丝