随笔分类 - C语言进阶剖析
摘要:第28课 - 指针和数组分析(上) 1. 数组的本质 (1)数组是一段连续的内存空间 (2)数组的大小为 sizeof(array_type) * array_size (3)数组名可以看作指向数组第一个元素的指针常量 思考下面两个问题: ① a + 1的意义是什么?结果又是什么? ② 指针运算的意
阅读全文
摘要:第29课 - 指针和数组分析(下) 1. 数组的访问方式 (1)访问数组元素有两种方式:以下标的形式访问数组中的元素 和 以指针的形式访问数组中的元素。 (2)下标形式 VS 指针形式 指针以固定增量在数组中移动时,效率高于下标形式 指针增量为1且硬件具有硬件增量模型时效率更高 下标形式与指针形式的
阅读全文
摘要:第27课 - 数组的本质分析 1. 数组的概念 数组是相同类型的变量的有序集合。 下图是一个包含5个int类型数据的数组的示意图: 2. 数组的大小 (1)数组在一片连续的内存中间存储元素 (2)数组元素的个数可以显示的或隐式的指定 观察下面两个数组,思考两个问题:① a[2],a[3],a[4]
阅读全文
摘要:第26课 - 指针的本质分析 1. 变量回顾 程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段内存空间? 2. * 号的意义 (1)在指针声明时,*号表示所声明的变量为指针 (2)在指针使用时,*号表示取指针所指向的内存空间中的值 3. 传值调用与传址调用 (1)指针是变量
阅读全文
摘要:第24课 - #pragma 使用分析 1. #pragma简介 (1)#pragma 是一条预处理器指令 (2)#pragma 指令比较依赖于具体的编译器,在不同的编译器之间不具有可移植性,表现为两点: ① 编译器A支持的 #pragma 指令在编译器B中也许并不支持,如果编译器B碰到这条不认识的
阅读全文
摘要:第25课 - # 和 ## 操作符使用分析 1. # 运算符 (1)# 运算符用于在预处理期将宏参数转换为字符串,即加上双引号 (# 运算符的操作对象是宏参数) (2)# 的转换作用是在预处理期完成的,因此只在宏定义中有效;编译器并不知道 # 的转换作用 (3)在有参宏中,# 只能和宏参数连用,不能
阅读全文
摘要:第23课 - #error 和 #line 使用分析 1. #error 的用法 (1)#error 是一个预处理器指示字,用于生成一个编译错误消息,这个消息最终会传递到编译器(gcc) 在思考这一点的过程中,领悟到了两个点: ① 使用 gcc 编译代码,输出的错误(警告)信息,是由预处理器、编译器
阅读全文
摘要:第22课 - 条件编译使用分析 这节课我们介绍如何使用C语言中的条件编译。 市面上的电子产品一般有低配版、中配版、高配版,那相应的软件也要开发三个版本吗?显然不是这样的,我们一般在同一套代码中使用条件编译区分不同的版本。 1. 基本概念 (1)c 程序的编译一般经过如下四个过程 条件编译是在预处理阶
阅读全文
摘要:第20课 - 链接过程简介 1. 思考一个问题 在具体工作中,每个软件项目都有很多个.c源文件,每个.c源文件经过编译后生成.o格式的目标文件,那么这些.o文件如何生成最终的可执行程序呢? 这里就要引入C语言的链接器了。 2. 链接器的作用 链接器的主要作用就是处理各个模块(目标文件和库文件)之间的
阅读全文
摘要:第18课 - 三目运算符和逗号表达式 1. 三目运算符 (1)三目运算符(a ? b : c)可以作为逻辑运算的载体 (2)规则:当a的值为真时,返回b的值;否则返回c的值 三目运算符的本质就是 if...else... 语句,只不过三目运算符格式更加方便优雅。 【三目运算符初探】 (3)三目运算符
阅读全文
摘要:第19课 - 编译过程简介 1. 初识编译器 我们通常所说的编译器其实是一个广义的概念,其实它里面包含了多个子模块,编译的过程由这些子模块协作完成。 编译器的工作过程 2. 编译器做了什么? 2.1 预处理 预处理由预处理器完成,预处理指令示例:gcc -E file.c -o file.i (1)
阅读全文
摘要:第17课 - ++和--操作符分析 1. ++和--操作符对应的两条汇编指令 (1)前置++/--对应的两条汇编指令:变量自增(减)1;然后取变量值 (2)后置++/--对应的两条汇编指令:先取变量值;然后变量自增(减)1 上面两条规则很简单,那 ++ 和 -- 操作符是不是就不需要研究了呢?我们使
阅读全文
摘要:第16课 - 位运算符分析 1. C语言中的位运算符 C语言中的位运算符直接对 bit 位进行操作,其效率最高。 2. 左移和右移运算符的注意点 (1)左操作数必须为整型类型即char、short、int,其中char和short被隐式转换为int后进行移位操作。其它的数据类型,如float等不能进
阅读全文
摘要:第12课 - 注释符号 1. 下面的注释正确吗? 在现代软件开发中,代码量动辄几十万行,这么庞大的程序非常需要注释,否则代码可能看的一头雾水。 先检验一下大家对注释的掌握程度,下面这个程序中的注释都正确吗? 怎么验证上面的注释是否正确呢?因为注释是由预处理器处理的,我们使用 gcc -E命令 预处理
阅读全文
摘要:第13课 - 接续符和转义符 1. 接续符 (1)接续符的意义:C语言中的接续符(\)是指示编译器行为的利器 /********** 额外的思考发现: ① 接续符由预处理器在预处理阶段处理 ② 接续符在读取后面的数据时,应该是根据"贪心法则"读取的,可以参考gcc -E的结果,接续符后面一行并没有全
阅读全文
摘要:第11课 - enum, sizeof, typedef 分析 1. enum介绍 (1)enum是C语言中的一种自定义类型,和struct、union地位相同,格式如下: (2)enum定义的第一个值默认情况下为0,后一个的值在前一个值的基础上加1 (3)enum在程序中有两种用法: ① 定义常量
阅读全文
摘要:第10课 - struct和union分析 1. 空结构体 在C语言中,结构体表示一系列变量的的集合,那编译器如何处理空结构体呢? 一类编译器认为,既然你是空结构体,内部没有成员变量那结构体大小就为0,但是可以正常编译;另一类编译器认为,空结构体有悖于结构体设计的初衷,既然结构体是变量的集合但空结构
阅读全文