博文
C/C++数组名与指针区别深入探索(2007-01-13 16:00:00)
摘要:引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。 想必这种误解的根源在于国内某著名的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者们,能以"深入探索"的思维方式和精益求精的认真态度来对待图书编写工作,但愿市面上多一些融入作者思考结晶的心血之作! 魔幻数组名 请看程序(本文程序在WIN32平台下编译):1. #include <iostream.h>2. int main(int argc, char* argv[])3. {4. char str[10];5. char *pStr = str;6. cout << sizeof(str) << endl;7. cout << sizeof(pStr) << endl;8. return 0;9. } 1、数组名不是指针 我们先来推翻"数组名就是指针"的说法,用反证法。 证明 数组名不是指针 假设:数组名是指针; 则:pStr和str都是指针; 因为:在WIN32平台下,指针长度为4; 所以:第6行和第7行的输出都应该为4; 实际情况是:第6行输出10,第7行输出4; 所以:假设不成立,数组名不是指针 2、数组名神似指针 上面我们已经证明了数组名的确不是指针,但是我们再看看程序的第5行。该行程序将数组名直接赋值给指针,这显得数组名又的确是个指针! 我们还可以发现数组名显得像指针的例子:1. #include <string.h>2. #include <iostream.h>3. int main(int argc, char* argv[])4. {5. char str1[10] = "I Love U";6. char str2[10]; 7......
如何成为高手(2006-12-02 23:02:00)
摘要:中国人大都喜欢用武侠小说来比较软件开发,但是在实战武功中,只有葵花宝典才是最厉害的,也只有掌握了葵花宝典,才能称为“不败”。 但什么才是软件开发的葵花宝典? 让我们先从一些现象出发。我们的前提是,软件开发是一项智力密集型劳动。对于智力密集型劳动,我们观察到的现象是,个体的表现差异很大,团队的表现差异很大,组织的表现差异很大,国家的表现差异很大。这不象体力占主要的劳动,象百米王跑百米的速度也仅比我快50%。但在棋类运动中,一个高手可以车轮战数位低手,而且毫无例外地将他们一一击败! 这些智力运动员表现出的特点是,计算精确而且速度快。其行为很象东方不败。虽然关于葵花宝典的传说很多,但最准确的描述只有一个字“快”。东方不败已经快到了吓人的地步。就象卡斯帕罗夫已快到了深蓝的地步。 有一则关于物理学家玻尔的轶事,有一次玻尔在普林斯顿大学听两个年青教授演讲他们的工作成果。期间玻尔突然发言说,如果照你们的研究算下去,会得到一个很有意思的推论。结果两个年青教授回去计算了两天,果然得出了同样的结论。玻尔是如何做到这样快的? 在软件开发中,我们同样注意到这样一种高手,他们可以每天写出一千行左右的高品质代码。他们可以运用已有的一些软件包,迅速完成一个新的产品。他们可以在很短的时间内,学会一项新的程序语言或是新技术。他们表现出一种神奇的速度。 在武侠小说中,所有的高手都有一些凡人不能企及的表现。象张无忌学太极,用龙爪手击败龙爪手名家;乔峰用太祖长拳击败天下英雄;姑苏慕容以其人之道还治其人之身,令狐冲一剑剌瞎十几双眼睛等等。我认为,之所以他们能做到这样,关键是在于他们快。 快并不意味着不准或品质差。快与品质并不矛盾。 高手的快,其实包含着很高的品质在其中。如果你因为高手的快,就质疑其品质,那就相当于在问:东方不败出手那么快,会不会刺不准?东方不败并不满足于刺死对手,他会在对手身上刺朵花。他把杀人变成了艺术。准确来说,他真正的兴趣不在杀人,而在于艺术。 退一步说,就算东方不败第一击有点偏差,他稍作修正后,马上跟上的第二第三击,也会击中他想击中的地方。在武功差的对手剑还没拨出来的时候,他已杀死对方并刺上了一朵花。 所以真正的软件高手,他并不满足于他的代码能有效......
计算圆周率 Pi (π)值, 精确到小数点后 10000 位(2006-11-24 22:59:00)
摘要:Victor Chen, (C++ 爱好者)
大家都知道π=3.1415926……无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题。现在有了电脑, 这个问题就简单了。电脑可以利用级数计算出很多高精度的值, 有关级数的问题请参考《高等数学》,以下是比较有名的有关π的级数:
其中有些计算起来很复杂, 我们可以选用第三个, 比较简单, 并且收敛的非常快。因为计算π值, 而这个公式是计算π/2的, 我们把它变形:π = 2 + 2/3 + 2/3*2/5 + 2/3*2/5*3/7 + ...
对于级数, 我们先做个简单测试, 暂时不要求精度:用 C++ Builder 新建一个工程, 在 Form 上放一个 Memo1 和 一个 Button1, 在 Button1 的 OnClick 事件写:
void __fastcall TForm1::Button1Click(TObject *Sender){ double x=2, z=2; int a=1, b=3; while(z>1e-15) { z = z*a/b; x += z; a++; b+=2; } Memo1->Text = AnsiString().sprintf("Pi=%.13f", x);}
按Button1在Memo1显示出执行结果:Pi=3.1415926535898
这个程序太简单了, 而且 double 的精度很低, 只能计算到小数点后 10 几位。把上面的程序改造一下, 让它精确到小数点后面 1000 位再测试一下:在 Form 上再放一个按钮 Button2, 在这个按钮的 OnClick 事件写:
void __fastcall TForm1::Button2Click(TObject *Sender){ const ARRSIZE=1010, DISPCNT=1000; //定义数组大小,显示位数 char x[ARRSIZE], z[ARRSIZE]; /......
带着我的认证上路:五步成为网络专家 (2006-11-21 23:10:00)
摘要:
作者:徐斌 文章来源:搜狐教育社区 更新时间:2006-01-13
参加认证考试是相当多的人寻求职业发展的必经之路。但市场上的证书多如牛毛,你该参加哪一个?本文将为有志于在网络管理与设计方面发展的学员做了一个认证道路五步规划,对各位颇有借鉴意义。
虽然现在社会上有一些关于“认证证书不值钱”的议论,但对于绝大多数人来说,没有证书,还是“万万不能”的。 在国外,每增加一个认证证书都会带来薪水的提高。国内的薪资水平虽然没有国外那么高,但是相比较国内其他行业,也十分可观。因此,如果能够合理地规划好认证证书的学习与考试,就既能学到全面系统的知识,又容易找到适合自己发挥特长的工作环境。
第一步:通过MCSE 网络从此不再陌生
作为迈向认证考试道路的第一步,首先推荐学习并考取微软Win2003的MCSE(微软认证系统工程师)。拥有MCSE证书,就表明你已经能够设计、实现、维护和支持信息系统,能够在各种环境中使用微软Windows Server网络操作系统和BackOffice家庭的集成服务器产品。
如果有一年以上丰富的Win2003 管理、应用及实践经验,那么一般集中复习3~6 个月就能通过考试。虽然微软考试的科目有些多,但是大多数科目涉及的内容都很容易找到实验环境,因此推荐首先考取此认证。
第二步:拿下CCNA展开网络全面接触
准备Cisco 的CCNA(Cisco认证网络支持工程师)认证考试,预计需要使用6~12个月的时间。虽然考试内容只有一门课程,但是较微软的课程有一些深度,并且不太好找实验环境。一般推荐使用模拟路由器的软件先在计算机上进行模拟试验。如果工作中有机会,可以多接触一下Cisco 路由器的具体操作。实在没有把握,可以参加一些实验室环境比较好的培训,多看一些英文资料,在相关论坛上多交流,都有利于准备好这个认证的考试。
第三步:考取CNA/CNE管理网络得心应手
有了两个认证在手,如果工作环境不适应继续学习,就可以找一个和上述技能密切相关的单位来工作。在具体工作中,实践并丰富自己的经验,并且为考取CC......
编程经验谈:如何正确使用内存(2006-11-01 22:50:00)
摘要:编程经验谈:如何正确使用内存
对于初学者来说,内存是个神秘的空间。程序的绝大部分错误,也是在于内存的使用不当造成的,而且这些错误有些都是隐藏很深的。所以,如何掌握内存的使用,通晓系统对内存的管理手段,将是软件成功的一个非常关键的因素。 首先我们要了解内存的分配方式。一般来说,内存的分配方式有三种: 1.从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 2.在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 3.从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 以上三种分配方式,我们要注意内存生命期的问题: 1.静态分配的区域的生命期是整个软件运行期,就是说从软件运行开始到软件终止退出。只有软件终止运行后,这块内存才会被系统回收 2.在栈中分配的空间的生命期与这个变量所在的函数和类相关。如果是函数中定义的局部变量,那么它的生命期就是函数被调用时,如果函数运行结束,那么这块内存就会被回收。如果是类中的成员变量,则它的生命期与类实例的生命期相同 3.在堆上分配的内存,生命期是从调用new或者malloc开始,到调用delete或者free结束。如果不掉用delete或者free。则这块空间必须到软件运行结束后才能被系统回收。 下面我们再看看,在使用内存的过程中,我们经常发生一些什么样的错误。以及我们应该采取哪些对策。 发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。 常见的内存错误及其对策如下: 1 内存分配未成功,却使用了它。 编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的......
面向对象编程,我的思想(下)(2006-11-01 22:46:00)
摘要:面向对象编程,我的思想(下)
2.3深入探讨函数: 2.3.1构造函数、默认构造函数、 缺省构造函数
对于上面的实例,它已经能完成绝大部分工作了,但它还是不完善的,还有许许多多的细节等到我们去完善!也许有的同学已经注意到了,当我创建完“jingwei”这个对象时,这个对象的所有的属性都是空的,也就是说:这个对象的姓名是未定的、年龄是未定的、性别是未定的、薪水是未定的、午餐也是未定的。而我们想把这些属性都添加上去,就还要用对象调用相应的方法,去一个个修改!天啊,这简直是太麻烦了!有没有什么好方法能够在我们创建对象的同时就完成了对属性赋值的操作呢?哦不,应该说是对属性的初始化呢?当然没问题了,这就需要所谓的构造函数! 构造函数是类中最特殊的函数,它与析构函数的功能正好相反! 从特征上来说:1.它是编程语言中唯一没有返回值类型的函数。 2.它的名称与类的名称必须要完全相同。 3.它必须被声明为公共(public)的类型 4,可以对构造函数进行重载。 5.它在创建对象是自动被调用。 从功能上来说:1.它是对类中的属性进行初始化。 其实,对于上面的程序来说我们没有自己定义构造函数。但是,在这种情况下,系统会自动为我们定义一个“默认构造函数”。他会把数值变量自动赋值为0,把布尔行变量赋值为false等等(但在C++中,默认构造函数不初始化其成员)。如果程序员定义了构造函数,那么系统就不会再为你的程序添加一个缺默认造函数了。(在这里,我们提倡的是自己定义构造函数,而不是用系统的默认构造函数) 还是看个实例吧!这样比较清楚一些!
//employee.java public class employee{ private String name; //员工姓名 private int age; //员工年龄 private char sex; //员工性别 private float emolument; //员工薪水 private boolean lunch; //员工午餐 //……等等 public employee(){ //这个就是“默认”构造函数 name = “jw”; //设置员工姓名 age = 20; //设置......
经典:面向对象编程,我的思想(上部)(2006-11-01 22:23:00)
摘要:经典:面向对象编程,我的思想(上部)
前言:整理这份资料的目的是为了帮助我的同学能够更直观的理解面向对象的编程。让后来者能够少走一些弯路。但其中不免有许多漏洞及错误,也还请前辈提出宝贵的更改意见,毕竟交流会让我们不断的进步。
技术是日新月异的,他不会等待你的成长。技术要拿出来于别人交流,自己学是自己主观意识上的理解,有对有错!交流会让进步变得更快。我认为如果计算机的体系结构不发生革命性的变化,我们现在所应用的程序语言也就百变不离奇踪了!学编程学的是什么?思想!精通一门编程语言(最好是面向对象的语言)后再去搞其他的编程语言,你会发现过程是如此的行云流水!为什么?你已经把编程的思想掌握了,再去学其他的,无非是学习一种新的语法格式了。
我在这里并不是和你讨论怎么去用C++或JAVA,也不是和你讨论怎么去学他们,我要和你讨论的是怎么去理解面向对象。其中主要会涉及到“类、对象、继承、属性、方法、静态、重载、隐藏、重构、声明、定义、初始化、赋值等”其中有许多相关技术我只会一代而过,让你有一种到此一游的意味我就达到目的了,而更详细的技术内幕,就请参考其他相关书籍而深入研究吧!因为我只是在和你探讨如何去更好的理解面向对象!
如何去提高效率?重复使用资源,把别人的东西拿来就用。这是很不错的主意!而对于你来说,最大的资源就是信心以及积极性!好,打起精神来,让我们一同到面向对象的编程中去寻幽访胜吧!
注:文章中所有程序实例我都使用JAVA写的,当然在C++中也就大同小异了了,不同的地方我会指出!
注:文章中的正文文字用黑色,说明文字用蓝色,强调文字用橙色,批改文字用红色!正文:
1.基本概念:
1.1 类与对象的初探
要我说,无论是面向过程的语言也好,面向对象的语言也罢,我首先要给他讲的都是类和对象!--------“这个世界是由什么组成的?”这个问题如果让不同的人来回答会得到不同的答案。如果是一个化学家,他也许会告诉你“还用问嘛?这个世界是由分子、原子、离子等等的化学物质组成的”。如果是一个画家呢?他也许会告诉你,“这个世界是由不同的颜色所组成的”。……呵呵,众说纷纭吧!但如果让一个分类学家来考虑问题就有趣的多了,他会告诉你“这个世界是由不同类型的物与事所构成的”好!作为面向对象的程序员来说,我们要站在分类学家的角度去考虑问题!是的,这个世界是由动物、植物等组成的......
入门训练:写程序应注意的事项(2006-11-01 22:19:00)
摘要:入门训练:写程序应注意的事项
1.对于文本编辑框,一定要判断是否含有非法字符。对于数字型一定要判断是否含有非数字。对于字符型,一定要判断是否在允许的字符内。2.对于在某一个期间,一定要判断前面一个日期是否大于后面一个日期。还要判断2月份的日期。(www.chinaren.com中的出生日期就没有判断这一点)。不要告我诽谤:) 3.对于路径选择,一定要判断路径是否合法,是否可以访问。输入的路径长度是否超过了最大字符长度。 4.对于要写进数据库的值,一定要判断是否超过了字段定义的长度。 5.在往网络的某一个文件夹写数据时,要判断是否可写。 6.对于在界面中的默认数据,一定要显示默认值,哪怕是0也应该显示,因为软件不是一个人用,其他的人可能不知道。 7.在做批量删除时,最好提供一个取消的按钮,让别人有一个后悔的机会。 8.在做长时间的操作时,一定要使鼠标变成漏斗型,让别人知道你的程序还在运行。最好用一个进度条来显示进度。给用户继续等下去的信心。 9.对于菜单条中的菜单项,最好在工具条上做一个快捷方式,用户都很懒,巴不得坐在那里,不动键盘和鼠标,你的程序都能工作。 10.操作系统中的文件夹和文件是不区分大小写的,但写在程序中的代码是区分大小写。特别是判断某一文件是否存在时。 11.在一个界面中,功能集中的按钮尽量放在一起,不要到处天女散花。 12.在多线程调用DLL时,要注意并发访问的问题。 13.在往硬盘或数据库写数据时,最好先写往缓冲区,然后一次性写入,这样可以加快速度。 14.参数在命名时,尽量取的要有意义,不要到处是a,b什么的。。一个函数不要写的太长,要多写注释。你走了,为后面来的人做点好事。 希望大家把自己觉得应该注意的地方也写下来,供新手参考。
......
写给即将步入大学,主修计算机专业的青年们的一封信(2006-10-31 13:28:00)
摘要:
写给即将步入大学,主修计算机专业的青年们的一封信
写给即将步入大学,主修计算机专业的青年们的一封信
大家好,新入学的学弟学妹们! 离开了辛苦高中阶段学习之后,恭喜您终于走进了大学的殿堂。尤其是学习计算机专业的你们,是祖国未来的IT精英,我们国家的信息化建设,未来世界的信息战的主力军就是你们了。因此作为一位过来人,我感觉有必要把我这么多年,走过的,看过的,听过的告诉大家,希望对大家未来的学习有所帮助。 其实这两年随着高校的扩招和IT人才的日趋饱和,IT人才的就业前景也不容乐观了。如果你自认为长相或者才艺出众,并且希望毕业后找到好的工作。我首先建议你去参加什么超级女生,超级男生之类的比赛,如果走红了,在演艺圈发展赚的钱要比搞IT多的多。 如果不是上面所说的这类人,那么就请继续往下看。 首先,我们来看看目前中国的大学环境,大学就是一个社会,因此你必须学会在这个社会里面与别人竞争。我们先来看看学校里面有哪些人群。第一类,学生干部们。如果你不希望以后留校作辅导员,那么不要参加所谓的学校的学生会之类的组织。那些所谓的学生干部就是打杂的。除了这些学生干部之外,此外学校里面还有几种人:一是拼命学习指望拿奖学金和保送读研的。这些人通常成天泡在自修教室里面或者图书馆里面。3年级之后,也许会进入导师的实验室。 二是家里有钱,整天除了打游戏就是泡美眉的。如果你想打游戏,卖装备赚钱,那你就一门心思投入进去,否则还是不要玩。至于交女朋友,劝你还是不要想,浪费时间,浪费钱,还不会有结果。此外还有就是做生意的,当然这里包括做推销买数码产品的,生活用品的,牛奶水果,反正卖什么的都有。当然,还有那些参加数学,物理比赛的,考证的,搞创新的就不赘述了。 不过说到底,我们都是搞IT,我个人推荐大家一条路,那就是1,2年级把专业课搞好,拿点奖学金和争取保送名额,同时打好搞开发的基础。3 4年级抽出时间做项目,赚钱。 计算机这门课非常特殊,基本上国内的基础课和国外相比相对落后,而且和实践比较脱节。所以一些专业课大可以酌情考虑是否去修。很多课程考试前一个礼拜突击一下就可以应付。......
我的一点自学心得(2006-10-31 13:18:00)
摘要:
我的一点学习心得[强烈推荐给新手](转)
我的一点自学心得[转帖](强烈推荐给新手)
在网上常看到朋友问很多有关于数学学习的问题,有数学系的,也有纯自学的,许多问题我都亲身经历过。在这里就简单说一下我的个人经验,希望对大家有一定的借鉴作用。如果你智商非常高或者成绩非常好的话,可能本文不太适合你,因为本文作者智商一般,成绩也很差,应该不会想到你们想不到的东西首先,选择学数学,那说明这个人还是比较聪明的,至少他应该知道如何利用自己的智商,这点很重要。学习最重要的是要量力而行。掂量一下自己的分量再说。不止一次看到朋友说自己爱学微分几何拓扑什么的,但是作为基础的一些科目,掌握的却不甚好,这样就说明大家有盲目追前的弊端,其实我个人也有这个毛病的。后来遇到了一些事,才开始意识到自己的不足。建议大家读读华罗庚的书,个人觉得对人有极大好处,一点也不是夸的,他的学术水平暂且不提,单就作学问的哲理,第一流的。说白了。就是八个字:本固枝繁,根深叶茂。我个人看过许多传记类的书,现在不爱看了。我相信很多朋友受它的影响很大的,总觉得应该像天才一样思考,要学习的多么多么的快,当然也有迫于一些外界因素必须要赶紧学习的。我个人的建议是:脚踏实地,学一点是一点,盲目的超前只能使你一事无成,自毁前途,一点不是吓唬人,我遇到的这样的人多了。学习要稳稳的,端正自己的态度,不要看那些天才,也不要看身边的什么什么人。不要搞革命英雄主义,成天想着:他能作到的我一定要作到。多想想为什么他能作到一件我作不到的而我做不到一件他做不到的。学数学重在个人见地,不在于硬和人家拼强项。端正了学习的态度(之所以第一个提它,主要是因为不光学数学,做任何学问都是如此)。然后就要问问自己:为啥学数学??你了解数学吗??对两类人自学的:我接触的这些朋友比较多。每个人都说自己对数学多么的狂热。俺说句心理话,我就看不出来数学这枯燥的东西对人能有多大的魅力。很多人我感觉是受一些外在的因素的影响:比如学数学会使人很高深等等的。尤其是最近的风气也是对数学有利。所以迎风上。可能我的话有点尖刻。但事实就是如此!很多人对数学缺乏一些常识性的了解,仅仅看了几篇描写大师的作品,就声称自己爱数学,是很让人痛心的,学数学,比娶个老婆还更......
