| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 971 人关注过本帖
标题:关于数组的疑问、
只看楼主 加入收藏
宅云云丶
Rank: 2
等 级:论坛游民
帖 子:71
专家分:11
注 册:2011-10-25
收藏
得分:0 
回复 6楼 beyondyf
老师说了每个人想法不一样 ,抄了就看得出来。
不过还是很感谢你。
但我现在还是不会,
打算用换行符了 不用数组了。。
无语了
2011-10-30 23:51
宅云云丶
Rank: 2
等 级:论坛游民
帖 子:71
专家分:11
注 册:2011-10-25
收藏
得分:0 
回复 7楼 A13433758072
= = 变长数组。。?
2011-10-30 23:51
宅云云丶
Rank: 2
等 级:论坛游民
帖 子:71
专家分:11
注 册:2011-10-25
收藏
得分:0 
回复 8楼 忆泪
我不太理解宏定义。
是不是c#或者c++的。。?
2011-10-30 23:52
宅云云丶
Rank: 2
等 级:论坛游民
帖 子:71
专家分:11
注 册:2011-10-25
收藏
得分:0 
回复 9楼 TonyDeng
我想你的意思 是不是数组只是个常量。
2011-10-30 23:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
数组的尺寸(即其元素个数)只能确定一次,就像房屋,建立之后,要想改变面积,就得拆掉重建,是无法在原来基础上伸缩的。当你用int a[n]这种形式开辟数组的时候,n只能是常数,但数组里面的内容不是常数,每个元素都是可变的。int a[n]的问题在于,编译器在编译时,是否能够判断n是常数。如果你写int n = 10,然后再写int a[n],那么编译器就能够判断出n是常数,编译可以通过,它能够在程序中事先分配n * sizeof(int)的空间给数组a。但现在你的n是需要在运行时从键盘动态接收的,编译器根本无法知道n有多大,那么它在编译时就无法确定分配多大的空间给数组a,于是会给出编译错误信息。

像你这样要从键盘输入n,运行时动态创建数组,不能用int a[n]这样的形式,必须用int* a = (int*)malloc(n)这样的形式来创建数组a。但即使这样,一旦创建,这个数组的尺寸也同样固定下来了,要想通过改变n的值来改变数组a的大小,是不可能的,此时必须先把原来的数组释放掉,再用新的n值重建一个数组。这样的过程充满了陷阱,你不妨自己想象一下那些陷阱都是什么,这才是你写编程时要重点学习的地方,明白这些原理,才能辅助你学习其他语言,明白像BASIC那样的动态数组是怎么回事。

[ 本帖最后由 TonyDeng 于 2011-10-31 03:18 编辑 ]

授人以渔,不授人以鱼。
2011-10-31 02:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
宏只是一种文本处理手段,是编译器在编译阶段对程序源代码做搜索替换进行的,它不在语言语法作用之内。比如你写#define PI 3.14,那么在后面的程序代码中,只要你写了PI这样的标识符,编译器在编译的第一阶段,就会把程序文本中的所有PI全程替换为3.14(回忆一下文字处理软件如Word是怎么做搜索替换的),也就是说,编译器在这个阶段把你的程序文本改头换脸,没有PI的字眼,只有3.14。做完这一步骤,编译器才对程序代码正式编译,形成.obj文件(即所称的目标文件),最后第三步,是连接器(Linker)把所有.obj文件和.lib文件拼装为.exe的过程。C程序编译三部曲,是所有学习C语言编程的人都必须了解的。宏预处理,是第一步,#define N 30,然后int a[N],与int a[30]等同,编译器就只认识后者,没有N,当你宏定义了N,这个符号就被霸占了,不能把它当变量名用,写诸如N=50赋值、if(N==0)之类的代码,前者是铁定的语法错,后者会让你编译通过,但运行结果不是你想要的(你希望判断变量N是否等于0,但其实那不过是运算30==0的结果,永远是假,很多初学者都栽在这种地方)。

[ 本帖最后由 TonyDeng 于 2011-10-31 07:10 编辑 ]

授人以渔,不授人以鱼。
2011-10-31 03:36
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:1 
以下是引用TonyDeng在2011-10-31 03:36:03的发言:

宏只是一种文本处理手段,是编译器在编译阶段对程序源代码做搜索替换进行的,它不在语言语法作用之内。比如你写#define PI 3.14,那么在后面的程序代码中,只要你写了PI这样的标识符,编译器在编译的第一阶段,就会把程序文本中的所有PI全程替换为3.14(回忆一下文字处理软件如Word是怎么做搜索替换的),也就是说,编译器在这个阶段把你的程序文本改头换脸,没有PI的字眼,只有3.14。做完这一步骤,编译器才对程序代码正式编译,形成.obj文件(即所称的目标文件),最后第三步,是连接器(Linker)把所有.obj文件和.lib文件拼装为.exe的过程。C程序编译三部曲,是所有学习C语言编程的人都必须了解的。宏预处理,是第一步,#define N 30,然后int a[N],与int a[30]等同,编译器就只认识后者,没有N,当你宏定义了N,这个符号就被霸占了,不能把它当变量名用,写诸如N=50赋值、if(N==0)之类的代码,前者是铁定的语法错,后者会让你编译通过,但运行结果不是你想要的(你希望判断变量N是否等于0,但其实那不过是运算30==0的结果,永远是假,很多初学者都栽在这种地方)。



你就对宏有这点认识?
2011-10-31 08:15
宅云云丶
Rank: 2
等 级:论坛游民
帖 子:71
专家分:11
注 册:2011-10-25
收藏
得分:0 
回复 15楼 TonyDeng
说的有点高深,努力试试,非常感谢啊
打算明天再问问老师。
2011-10-31 19:41
宅云云丶
Rank: 2
等 级:论坛游民
帖 子:71
专家分:11
注 册:2011-10-25
收藏
得分:0 
回复 16楼 TonyDeng
你的意思是,一些字符,pi一系列的时开始编代码前就被指定好的。不能再次赋值。
应该是这个意思吧。。。
2011-10-31 19:43
宅云云丶
Rank: 2
等 级:论坛游民
帖 子:71
专家分:11
注 册:2011-10-25
收藏
得分:0 
回复 17楼 Devil_W
哈哈 我觉得他说的挺好的。
我初学 不太明白。。
2011-10-31 19:43
快速回复:关于数组的疑问、
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018685 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved