如何在C中“实现”数组?
数组尤其不是指针.可以肯定的是,两个左值似乎都包含(1维)虚拟内存中某个位置的(1维)坐标.但请考虑这个例子.
#include <stdlib.h> #include <stdio.h> int main(){ char buffer0[4096]; char* buffer1 = malloc(4096); printf("lvalue %16p sizeof %lun",(void *) buffer0,sizeof(buffer0)); printf("lvalue %16p sizeof %lun",(void *) buffer1,sizeof(buffer1)); // Example output: lvalue 0x7ffcb70e8620 sizeof 4096 // Example output: lvalue 0x7a4420 sizeof 8 } 想到的实际差异是: >数组知道它们有多大(以字节为单位)(并且,通过扩展,它们知道它们有多少元素);指针不会(但是malloc()必须知道指针有多大,知道在给定指针的情况下free()有多少……!) 总的来说,数组似乎比指针更聪明(但功能更少)(他们知道它们有多大,它们有多少元素,并且它们具有自动内存管理). 问题 >数组如何“知道”它们有多大?这是如何实现的? 解决方法
数组不知道它们有多大 – 没有与数组关联的元数据来指示大小(或类型或其他任何内容).在转换期间,编译器知道数组有多大,并且当时处理依赖于该知识的任何事物(指针算法,操作大小等).一旦生成了机器代码,数组就只是笨拙的内存块 – 通过查看数组对象本身,无法在运行时确定数组的大小(除了可变长度数组之类的可变修改类型,sizeof操作是在翻译期间计算,而不是运行时).
数组只不过是相同类型的连续对象序列.为宣言 T arr[N]; // for any type T 你得到 +---+ arr: | | arr[0] +---+ | | arr[1] +---+ | | arr[2] +---+ ... +---+ | | arr[N-1] +---+ 没有arr对象独立于数组元素本身,也没有任何元数据放在任何地方,无论是大小,起始地址,类型还是其他任何东西. 下标操作arr [i]定义为*(arr i) – 给定数组的起始地址,从该地址偏移i个元素(不是字节!)并取消引用结果. 你是正确的,数组不是指针 – 但是,除非它是sizeof或unary&的操作数.运算符,或者是用于初始化声明中的字符数组的字符串文字,数组类型的表达式将被转换(“衰减”)为指针类型的表达式,并且表达式的值将是第一个的地址数组的元素(同样,这都是在翻译期间完成的,而不是在运行时完成的). 因此,当您编写类似x = arr [i];的内容时,编译器会将表达式arr转换为指针值,因此下标操作可以正常工作. 相反,当您编写ap =& arr;时,编译器不会将arr转换为指针类型.结果仍然与第一个元素的地址相同,但类型不同 – 而不是T *,类型是T(*)[N],或“指向T的N元素数组的指针”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 如何修改ASP.NET中div的代码隐藏文件中的C
- C函数对象返回`p-> first`和`p-> second`
- flex复选框和下拉列表的几种用法整理http://www.
- xml – IntelliJ/Android Studio中一个文件的文件
- 让tableViewCell动画显示(swift)
- oracle – 如何最小化物理DDL更改和PL / SQL更改
- ruby-on-rails – 多个验证Rails 3(Zombies的Rai
- c – 在常量表达式上下文中定义之前嵌套的`const
- c# – EntityFramework代码首先用属性getters /
- 用jaxb方法将xml(带命名空间xmlns)转为java实体类