C语言基础-补遗篇
文章平均质量分 75
ipmux
这个作者很懒,什么都没留下…
展开
-
补遗篇之static
static的作用是IT公司C语言笔试必考题,看似简单却少有人能完整回答。因为它不止一个作用,并且随修饰对象的不同而变化,这里我总结成“有限生命变无限,无限空间变有限”。 static有三类作用对象:函数、局部变量和全局变量。其中局部变量只在函数运行期间存活,即“有限生命”;而函数和全局变量的作用域是无限的,也就是“无限空间”。 1)“有限生命变无限”是指static可以延长局原创 2013-12-13 16:36:20 · 862 阅读 · 0 评论 -
补遗篇之文件I/O
文件I/O库是ANSI C标准的一部分,换句话,任何标准C语言开发环境中都可以用fopen/fread/fwrite/fclose接口访问文件。这里强调与文件I/O相关的几个易混淆的问题。fopen/open的区别和联系 unix/linux下文件IO有两套接口,即fopen/open系列,它们区别又联系: a. fopen是标准C库接口,所有C开发环境都要支持它;op原创 2014-03-07 10:11:30 · 1485 阅读 · 0 评论 -
补遗篇之函数
函数怎么来的 函数最本质是跳转和压栈。 跳转早在汇编时代就广泛应用:做一个汇编子模块,需要时jmp到其起始地址,执行完jmp回之前的地址(想起学微机原理时一堆人围着单板机输入子模块指令,像发报一样)。 后来发现光有跳转也不够,赤裸裸去,再赤裸裸回,带不走一片云彩。于是想到可以划出一段内存空间,跳转到子模块时传递一些参数信息过去,顺带也可以把跳转前的地址也存进去,jmp原创 2014-02-28 20:50:18 · 953 阅读 · 0 评论 -
补遗篇之内联与内嵌
从没想过有人会把这两个毫不相关的概念混为一谈,可招聘时还真就碰到问内嵌答内联,问内联答内嵌的情况。上网一查,原来内嵌汇编也常被叫内联汇编,中文表述IT名词时真就这么乏力么?蹩脚的撞名一个接一个。 内联函数即inline函数,其作用是“建议”编译器展开函数,不是一定展开,除非设置强制内联(如gcc的__attribute__((always_inline)))。展开即把函数代码插入被调用位原创 2013-12-27 12:24:31 · 1393 阅读 · 0 评论 -
补遗篇之C字符串
C并没有字符串类型,C字符串是一个以null('\0')结尾的字符数组,用null标识字符串结束。如{'a','b','c','d','\0'},只有包含这个'\0’才算C字符串。注意null也好,'\0'也罢,都只是0的不同表达,如: char a[] = “ABCDEF”; printf(“a=%s\n”,a); a[2]=0; printf(“a=%s原创 2013-12-27 10:42:31 · 1265 阅读 · 0 评论 -
补遗篇之单行道标志const
面试时,问及const的含义,很多人会答:"const表示常量",这可不是考英文翻译,const应该更近似"只读"而不是常量。const语法 对非指针变量,const无论放在类型前或后,都表示变量属性为只读,运行过程中不能也不会赋值修改。如const int a;和int const a;这两种方式const作用相同,都表示a是一个常整型数。 而const修饰指针时则有所不原创 2013-12-26 20:59:34 · 935 阅读 · 0 评论 -
补遗篇之sizeof
sizeof是C的单目运算符,它给出操作数存储所需的字节数,其操作数可以是表达式或类型名。sizeof()是运算符,不是函数,没有函数调用开销。其结果是在编译阶段由编译器自动给出,相当于常数,不象函数那样在运行时才得到返回值。 sizeof常用来屏蔽同一类型变量在不同平台上占用不同空间的问题,能提高C程序的可移植性。不懂得利用sizeof就出现:int *p = malloc(800原创 2013-12-26 22:41:44 · 978 阅读 · 0 评论 -
补遗篇之命名空间污染
概念 C标准规定,除非用static限定,否则全局变量与函数都作用于全局(见补遗篇static),也就是说一个模块中定义的函数与全局变量可在所有其他模块中被调用。这导致C的符号命名没有层次,不同模块间名字相互冲突的概率很高。学术的表述就是:C命名空间易被污染。 比如,不同软件模块中定义了同名但不同实现的非static函数,由于它们都全局可见,编译器链接时无法正确区分和选择这些同原创 2013-12-17 14:24:31 · 3822 阅读 · 2 评论 -
补遗篇之volatile
C中volatile关键字在程序操作变量时,强制读写变量所在内存,以阻止编译器对某些特殊变量的错误优化。反过来,只有靠程序员用volatile过滤一些特殊情况后,编译器才能大胆优化。volatile作用可总结为:阻止三种情形下的两种编译器优化。两种编译器优化 a. 数据流分析优化:编译器分析程序中变量在哪里赋值、哪里使用、哪里失效,根据分析结果消除多余的变量读取和赋值步骤,如:原创 2013-12-29 14:36:03 · 835 阅读 · 0 评论 -
补遗篇之typedef
typedef关键字主要用于为C的固有数据类型定义别名,固有类型包括内部类型(int,char等)和自定义类型(struct,enum等),注意:typedef并不创建新类型,只是为现有类型加同义别名。typedef与#define区分 有时#define和typedef有表面类似的功能,正因为如此,更有必要弄清两者的本质差别和适用场合。typedef是为类型定义新别名,而#defi原创 2013-12-14 23:12:52 · 1000 阅读 · 0 评论 -
补遗篇之struct(enum/union)多种定义方式
结构体(struct)是各种变量组合形成的新数据类型,struct有多种定义形式,总结下来可分四种,初学者容易混淆。下面一并整理区分,其中要特别留意区分三个元素:结构标签名,结构变量名,结构别名。形式1: struct结构标签名 { 类型成员变量名; ...... }结构变量名;实例: struct tagPERSON原创 2013-12-14 11:51:05 · 1089 阅读 · 0 评论 -
C语言文本方式和二进制方式打开文件区别
转自:http://blog.sina.com.cn/s/blog_50b7dd7101012979.html,我们都知道,文本文件和二进制文件在计算机上面都是以0,1存储的,那么两者怎么还存在差别呢?我觉得,对于编程人员,文本文件和二进制文件就是一个声明,指明了你应该以什么方式(文本方式/二进制)打开这个文件,用什么函数读写这个文件(读写函数),怎么判断读到这个文件结尾。具体的说:转载 2014-03-07 10:18:11 · 2414 阅读 · 0 评论