`
totoxian
  • 浏览: 1038076 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

指针和定长数组

 
阅读更多

数组就是指针这个说法并不正确,只能说数组的名字是一个指针,指向数组的第一个元素,而数组的内容是该指针指向的内存后面连续的一段内存,这些内存可以用指针来寻址。重要的特点是“连续的一段内存”,因此数组元素就不能像链表节点那样仅仅通过一个指针来互相联系,它必须保证元素是一个挨着一个的,既然数组元素存在于连续内存,有了第一个元素的指针和元素的大小,后面的元素也就可以自然而然的得到了,可见数组是一种链表的特化,它不依靠显式的指针来首尾相接,而是靠“地址连续”这个特点隐式的首尾相接。
和链表相比,数组省去了next/prev字段,从而也就节省了sizeof(type*)*n这个么大小的内存空间,然而节省空间是有代价的,那就是数组必须有一个“外围”的数据结构以保证其地址空间连续,或者数组在编译的时候确定其大小n,直接为其预留sizeof(type)*n这么大的空间,否则无法保证同一个数组相邻元素间地址连续的要求。如果编译期间数组的长度是动态的,那么由于编译器并不知道数组的大小,只有在运行时才能确定,这样的话为其分配多大的连续空间好呢?要知道地址空间是有限的,分配小了可能不足以满足运行时数组大小的最大需求,分配大了可能会浪费很多可能根本不需要的内存,因此数组必须在编译的时候确定其大小,即使它有一个外围数据结构,比如:
struct type1 {
...
type2 t2[x];
...
}
虽然type1保证了t2的地址空间一定连续,这里的x也一定要是确定的长度,否则type1的大小就没有办法确定,不管type1在栈上分配-机器隐式分配内存,还是在堆上分配-程序员显式分配内存,都需要确定type1的大小。
为了地址的连续性导致了数组必须在编译期确定大小无疑是一个限制,这样的话,对于不确定大小和元素个数的数据结构,就必须使用链表来显式将元素互相连接了,如此一来即使知道在运行时分配的空间是连续的,也一定要使用一个额外的next/prev指针相连接,这样很不合理,因此gcc提供了在结构体后面增加一个0长度数组的办法支持变长的数据结构,使得程序可以在运行的时候分配出诸如数组一样的连续空间的数据结构,节省了内存:
struct test {
char *ptr;
int value;
char reverse[0];
}
如果在运行时,你确定reverse的长度为n,那么就可以如下这样为test结构体分配内存:
struct test *t = (struct t*)malloc(sizeof(struct test)+n*sizeof(char));

分享到:
评论

相关推荐

    环形数组的具体介绍.docx

    环形数组本质上是一个定长数组,其逻辑结构类似于一个环形或闭环。在物理上,环形数组仍然是一个线性的数组结构,但通过特定的索引计算和边界处理方式,使其表现出环形的特性。环形数组通常使用两个额外的指针(或...

    C语言不定长数组及初始化方法

    C语言不支持不定长数组,要么malloc,要么在动态的指定它的...//定义了一个单元的数组,并不是不定长数组 最好不用使用arr[] = {0}来定义数组,定义数组之前应要指定长度 int arr[256] = {0}; int a[256]={0};并不是把

    C语言程序设计(高清PDF)

    5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针表达式 94 6.3.1 指针...

    C语言程序设计(PDF格式)

    5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针表达式 94 6.3.1 指针...

    C语言程序设计.rar

    5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针表达式 94 6.3.1 指针...

    《C语言程序设计》-PDF格式

    5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针变量的引用 93 6.3 指针运算符与指针表达式 94 6.3.1 指针...

    GO语言基础学习文档

     定长数组:array 6  动态数组:slice 6  map 6  make、new操作 7 四、 流程和函数 7 流程控制(标签名是大小写敏感的) 7  If如果满足条件就做某事,否则做另一件事。 7  goto明智地使用它 7  for,...

    明解C语言(第3版)入门篇.[日]柴田望洋(带详细书签).pdf 【半高清】

    数组和指针的不同点 306 数组的传递 308 总结 311 第11章 字符串和指针 315 11-1 字符串和指针 316 用数组实现的字符串和用指针实现的字符串 316 用数组实现的字符串和用指针实现的字符串的不同点 318 字符串...

    C语言程序设计标准教程

    其中static表示是静态存储类型, C语言规定只有静态存储数组和外部存储数组才可作初始化赋值(有关静态存储,外部存储的概念在第五章中介绍)。在{ }中的各数据值即为各元素的初值, 各值之间用逗号间隔。例如: ...

    你必须知道的495个C语言问题

    6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 数组不能被赋值 6.5 为什么不能这样向数组赋值?externchar*getpass();charstr[10];str=getpass("Enterpassword:"); 6.6 既然不能向...

    《你必须知道的495个C语言问题》

    书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495个C语言问题》结构...

    传智播客扫地僧视频讲义源码

    06_数组指针类型和定义数组指针变量的3种方法 07_多维数组名本质剖析_传智扫地僧 08_多维数组的【】和多级指针星号转化推演 09_多维数组做函数参数技术推演和退化原因抛出 10_多维数组做函数参数退化总结_ 11_指针...

    c/c++ 奇技淫巧(一些c语言的技巧)

    用C实现,必然需要一个结构,结构当中应当有一个指针,指针分配一段内存空间,空间大小根据需要而定,而且必须有另外一个字段记录究竟开辟了多大多长的空间。 大致描述如下: Struct MutableLenArray { Int count...

    leetcode怎么判断指针为空-Homework:在家工作

    leetcode怎么判断指针为空 Homework 88. 合并两个有序数组 ...有个疑惑,在其中一个数组遍历完之后,临界条件的处理时,我是根据实际情况模拟来得出具体的下标应该如何根据现有的双指针(i,j)来得

    C语言精典版本C程序设计语言

    5.6 指针数组与指向指针的指针 5.7 多维数组 5.8 指针数组的初始化 5.9 指针与多维数组 5.10 命令行变元 5.11 指向函数的指针 5.12 复杂说明 第6章 结构 6.1 结构的基本知识 6.2 结构与函数 6.3 结构数组 ...

    C语言实例解析精粹

    020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指针比较整数大小 023 指向数组的指针 024 寻找指定元素的指针 025 寻找相同元素的指针 026 阿拉伯数字转换为罗马数字 027 字符替换 028 从键盘...

    C语言FAQ 常见问题列表

    o 7.4 那么为什么作为函数形参的数组和指针申明可以互换呢 ? o 7.5 如果你不能给它赋值, 那么数组如何能成为左值呢 ? o 7.6 现实地讲, 数组和指针地区别是什么 ? o 7.7 有人跟我讲, 数组不过是常指针。 o ...

    计算机二级公共基础知识

    数组、广义表、树和图等数据结构都是非线性结构。 (2)线性表的顺序存储结构具有以下两个基本特点: ① 线性表中所有元素所占的存储空间是连续的; ② 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 ...

Global site tag (gtag.js) - Google Analytics