自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 ASCII码0x1A使文件意外结束的处理方法

        在windows操作系统中,大家在编写带有文件操作的程序时,有时候会遇到一种奇怪的现象,在对一个文件以文本方式进行读取的过程中,读到中途还没到文件末尾时feof()函数就意外地为真,这让人很惊讶,一时难以找到原因,实际上,这是ASCII码0x1A在作怪。运行下面程序:int main(void){        int i;        unsigned char c;     

2005-11-20 12:44:00 6676 12

原创 如何高效产生m个n范围内的不重复随机数(m<=n)

        如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些比较是多余的,完全可以不进行比较,只要反过来,按顺序产生这些数,但随机产生它们的位置。例如下面产生100个100以内不重复随机数的代码:int a[100];for(i=0; ifor(i=99; i

2005-11-07 08:09:00 8152 18

原创 标准输入输出函数%[]和%n说明符的使用方法

        标准输入输出函数scanf具有相对较多的转换说明符,它常常作为入门级函数出现在各种教材中。但奇怪的是,[]和n这两种都为c89/c99所规定的标准说明符却鲜少在大多数教材中出现。虽然[]和n说明符的使用频率不及其它说明符,但两者在程序设计中的作用仍然不可小视,尤其是[]说明符。        众所周之,scanf以空白字符为定界符,但如果输入的字符串是以其它字符为定界符的,那怎么办

2005-10-23 22:55:00 5552 1

原创 不定长字符串输入处理小技巧

        大家在编程的过程中,经常会遇到需要输入一个不定长字符串的情况。通常来说,解决这个问题可以有两种方法:        一是先分配一个固定长度的缓冲区,把输入的字符串先存储到这个缓冲区,然后再根据其长度动态分配内存。这个方法缺点是无论分配多大的缓冲区,都无法完全满足要求。太大浪费内存,太小会发生字符串截断。        二是逐个字符输入,然后通过realloc函数来实时改变缓冲区的大

2005-10-23 22:49:00 3269 5

原创 单双精度浮点数的IEEE标准格式

        目前大多数高级语言(包括C)都按照IEEE-754标准来规定浮点数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11为阶,53位尾数和1位符号位,如下图所示:单精度浮点数存储格式 s指数  尾数                 

2005-10-23 22:45:00 3984 1

原创 《再再论指针》后记

        在这篇后记中,笔者将对三个问题进行补充:一、关于数组名取地址的问题。c89、c99允许对数组名取地址,是由于数组符合一个对象的定义,按照一        个对象的语义,对其取地址是合理的。但矛盾在于,数组名是一个符号地址,是一个右值,对其取地址不        符合&运算符的语法。c89、c99委员会经过权衡,认为维护一个对象的合理性比一个运算符更重要、更合        理,因此

2005-10-17 16:07:00 4914 4

原创 再再论指针----篇首语

        指针是C语言规范里面一项核心内容,指针具有与生俱来的优势,利用指针可以写出许多短小精悍、效率极高的代码,它是C语言一把无可替代的利器,凭着这把利器,C语言与其它高级语言相比至少在效率方面高人一筹。但是,由于指针的原理与使用方式跟人们通常的思维习惯有较大的差别,造成了指针比C语言其它概念难理解得多,这使得对指针认识不足成为了一种在C程序员中普遍存在的现象,这种不足必然导致程序员在指针

2005-09-17 16:19:00 8723 4

原创 第一章 什么是数组名?----一个让你吃惊的事实!

        数组是指针的基础,多数人就是从数组的学习开始指针的旅程的。下面我节选一些在各种论坛和文章里经常见到的关于数组的文字:“一维数组是一级指针”“二维数组是二级指针”“数组名可以作为指针使用”“数组名就是..........的常量指针”“数组名就是..........的指针常量”..................................这些文字看起来非常熟悉吧?类似的文字还有许

2005-09-17 16:17:00 16510 105

原创 第二章 再一次吃惊----数组的数组与多维数组的区别

        看见这个题目,也许有些人就会嘀咕了:难道两者不是一样的吗?C语言的多维数组不就是数组的数组吗?不!两者是有区别的,而且还不小呢。首先看看两者的共同点:1。内存映象一样。2。数组引用方式一样,都是“数组名[下标][下标]........”。3。数组名都是数组的首地址,都是一个符号地址常量、一个右值。        由于两者的共同点主要反映在外部表现形式上,因此,从外部看来,数组的数组

2005-09-17 16:14:00 7242 15

原创 第三章 数组的解剖学

        这一章我们来讨论一下数组的内涵,对数组的内部构造进行一次解剖,看看里面究竟隐藏了什么秘密。 有了前面两章对数组名和C语言数组本质的澄清,再来理解这一章的内容,就容易多了。        在下面的叙述中,笔者会用到一个运算符sizeof,由于在不同的编译器和编译模式下,对一个地址进行sizeof运算的结果有可能是不同的,为了方便讨论,我都假设地址长度为4个字节。        多数教

2005-09-17 16:11:00 6582 14

原创 第四章 [ ]运算符的本质

        数组是存在于人们头脑中的一个逻辑概念,而编译器其实并不知道有数组这个东西,它所知道的,只是[]运算符,当遇到[]运算符的时候,编译器只是简单地把它转换为类似*(*(a+i)+j)这样的等价表达式,之所以是这种表达式,如前几章所述,是因为C语言的数组实现本质上是数组的嵌套。         由于这种等价关系的存在,会产生一些古零精怪的表达式,例如:10[a]这个表达式初看上去让人摸不

2005-09-17 16:09:00 5645 7

原创 第五章 指向数组的指针

        讲到第五章了,数组两个字还离不开我们的左右,数组的内容也真多,另一方面也因为数组与指针的关系的确非常密切。         通常,对于int a[8][9]这个二维数组,我们可以这样定义一个指向它的指针:int (*p)[9];这个声明的形式跟人们所熟悉的int *p的形式大相庭径,初学者通常会感到迷惑,不理解的地方大致有四个:1。为什么会以这种形式声明?2。(*p)应该如何理解?

2005-09-17 16:04:00 16600 12

原创 第六章 “另类”数组

        动态数组与字符串常量可算是两种“另类”数组。        VLA可变长数组并不为C89所支持,C99才开始支持VLA。但如果想在只支持C89的编译环境中使用VLA的话,怎么办呢?我们可以用动态数组来“模拟”,动态数组在矩阵的运算中很常见,常用来向函数传递一个大小可变的矩阵。动态数组的原理,是利用一块或多块动态分配的内存存储各维的首地址,这样就可以p[i][j]的形式访问数组的数据

2005-09-17 16:00:00 6341 3

原创 第七章 C语言声明详解

        人们常说,C语言的声明太复杂了,的确,这也是C语言饱受批评的地方之一。不过,笔者认为,真正要受到批评的不是语言本身,而是那些传播者。传播者们通常都有一个共识:讲述要由浅入深。作为原则,笔者并非要反对它,毕竟笔者对C语言的学习,也经历了相同的过程。但是,由浅入深并不意味着一切从简,以偏盖全。计算机语言不同于数学理论(虽然它的确根植于数学,与数学密不可分),数学理论是一种循序渐进的过程

2005-09-17 15:58:00 7474 5

原创 第八章 右左法则----复杂指针解析

        上一章费那么多唇舌讨论C语言的声明,其实目的都是为了这一章,期望读者通过对C语言声明形式的详细了解,树立声明嵌套的观念,因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何

2005-09-17 15:56:00 7152 7

原创 第九章 指针与const

        const一词是英文constant的缩写,设立这个关键字的本意,是希望让它所修饰的对象成为一个常量。记得在国家间的外交中,有一个经常用到的术语:“从事与身份不符的活动”,这个const恰恰也正从事着这样的活动,呵呵。C语言可以有三种方法定义一个常量:#define、const和枚举,但只有枚举才是真正的常量,什么是真正的常量?真正的常量是没有存储空间的,是一个右值,这意味着通过任

2005-09-17 15:53:00 5690 7

原创 第十章 围绕p()与(*p)()的争论

        对于一个函数:void func(void);我们通常可以定义一个这样的函数指针指向它:void (*p)(void) = func;通过p调用func时,通常有两种写法:p();或者(*p)(); 围绕这两种写法,当初C89制定的时候曾经有过争论。(*p)();是一种旧式的规定,旧式规定圆括号左边必须具有“函数”类型,如果是指向函数的指针,那么必须加上*声明符。但C89不再把圆括

2005-09-17 15:51:00 6203 9

提示
确定要删除当前文章?
取消 删除