注册 登录
编程论坛 C++教室

数组,动态数组

未未来 发布于 2013-03-31 23:31, 920 次点击
突然弄不清楚,数组和动态数组的区别了,,,,

如果要向一个数组插入新的元素,可以实现吗。
一定要用动态数组吗?
12 回复
#2
xiaohui012013-04-01 00:40
可以把!
#3
peach54602013-04-01 08:09
数组是死的,动态数组是活的

向数组插入新元素一定是办不到的(要是有人反驳我再解释)
#4
TonyDeng2013-04-01 08:25
动态数组,很多程序员都希望能够实现(在解释型语言中全部都能够轻易实现),但在编译型语言中一般做不到,C99推出了VLA的方法,可以在某种程度上实现(其实只是实现了动态创建数组,但数组创建之后尺寸是不能再变的),这个东西C++没有采纳(实际上Microsoft和Borland对C99都不感冒,它们不完全遵循C99标准),C++是使用vector实现了,是真正的动态可伸缩的容器类。

[ 本帖最后由 TonyDeng 于 2013-4-1 08:28 编辑 ]
#5
peach54602013-04-01 11:12
哎,我还准备等着有人反驳我,我再解释原理的
T版这么一闹,估计没人问了
#6
TonyDeng2013-04-01 11:14
你可以说的嘛,反驳我么。
#7
gfchen18192013-04-01 11:43
愿闻其详
#8
peach54602013-04-01 13:35
以下是引用TonyDeng在2013-4-1 11:14:18的发言:

你可以说的嘛,反驳我么。

呵呵,我说数组不能插入就是等着初学者来反驳我的
结果你已经解释清楚了,呵呵
#9
未未来2013-04-01 15:31
回复 8楼 peach5460
嘿嘿,我来,就是建立一个较大的数组,然后插入时,将后面的元素往后移一位。
还有,为什么说动态数组是活的,
#10
peach54602013-04-01 16:09
所谓动态数组,就是声明数组可以不写大小的...
你所谓的"建立一个较大的数组,然后插入时,将后面的元素往后移一位。"
大概就是动态数组的原理了
#11
TonyDeng2013-04-01 17:11
想想C能不能随时变化字符串的长度就知道了
#12
TonyDeng2013-04-01 17:30
C/C++的字符串就是字符数组,一经创建,其空间就不能改变,如果要改变空间尺寸,则需要另外找内存把原来的数据复制过去,这是C/C++数组的基本特征,即使是C#的字符串string,也是这样的(C#中的string,对内存作任何改变,实际上都是重新创建的新字符串)。你可以申请预留较大的数组空间,但绝不可以临时增减这个空间的容量了。即使用动态申请内存malloc()建立数组,也同样是不能改变这块内存的大小,有人以为realloc()可以改变这块内存的大小,是极大的误区,这个函数实际上操作的是另外开辟一块内存然后把原来的数据复制过去,再把新内存的指针返回,这样,新指针和旧指针的值是不一样的,那样爱用指针的程序员就很容易死翘翘,因为它会以为那是同一块内存——这也是后来很多语言禁用指针的原因,新的C/C++语法都有自动跟踪地址变化的智能指针,不再是现在大家所看到的那样。

[ 本帖最后由 TonyDeng 于 2013-4-1 17:38 编辑 ]
#13
peach54602013-04-01 19:42
以下是引用TonyDeng在2013-4-1 17:30:07的发言:

C/C++的字符串就是字符数组,一经创建,其空间就不能改变,如果要改变空间尺寸,则需要另外找内存把原来的数据复制过去,这是C/C++数组的基本特征,即使是C#的字符串string,也是这样的(C#中的string,对内存作任何改变,实际上都是重新创建的新字符串)。你可以申请预留较大的数组空间,但绝不可以临时增减这个空间的容量了。即使用动态申请内存malloc()建立数组,也同样是不能改变这块内存的大小,有人以为realloc()可以改变这块内存的大小,是极大的误区,这个函数实际上操作的是另外开辟一块内存然后把原来的数据复制过去,再把新内存的指针返回,这样,新指针和旧指针的值是不一样的,那样爱用指针的程序员就很容易死翘翘,因为它会以为那是同一块内存——这也是后来很多语言禁用指针的原因,新的C/C++语法都有自动跟踪地址变化的智能指针,不再是现在大家所看到的那样。
我顺带提一嘴
智能指针也不能解决所有的问题...
1