C程序设计语言阅读笔记
C程序设计语言阅读笔记
[TOC]
一、导言
- 一个程序从无到有,经历的阶段有编写程序文本、编译、加载、运行。
- 在C语言中,所有的变量都必须先声明再使用,声明一般放在函数的起始处。
- int 通常为2个字节,16位,long通常为4字节,32位,一般来说, short ⇐ int ⇐ long
- 整数作触发操作时,其小数部分会被省略,例如9 / 5 = 1,小数部分被省略了。但是9.0 / 5 则会得到浮点数。
- 打印时候,%6d,6表示至少占6个字符宽,%6.2f表示,至少占6个字符宽,且保留2位小数。%o 表示八进制数, %0x 表示十六进制。
#define
定义符号常量时候,是没有括号的。- 形式参数: 函数定义中圆括号内列表中出现的变量,
- 实际参数: 函数调用中与形式参数对应的值
- 函数原型:int power(int m, int n);函数原型必须与函数的定义和用法一致。在函数原型中,参数名是可选的。
- 在C语言中,函数的参数是传值调用,即传递给被调用函数的参数值是存储在临时变量中的。
- 字符数组中,即字符串中,sizeof是实际占有的空间,strlen是指的是字符串的长度,实际占有的空间会比字符串长度大1,因为字符串结尾会补\0。
- 局部变量(自动变量):定义在函数中,不能被其它函数直接访问,自动变量如果没有复制,则其中存放的是无效值,即不知道他是什么值
- 外部变量定义在函数之外,且只能被定义一次,定义后,由编译程序为其分配空间。声明外部变量时候,可以用extern,外部变量为自动初始化为0
- 声明时只是说明变量的类型,而定义除了说明类型,还会分配空间。
二、类型、运算符与表达式
- 对象可以用const(常量)类型,表示其值是不能修改的
- 在传统的C语言中,变量使用小写字母,符号常量使用大写字母
- long类型的常量以l或L结尾,无符号数则用ul或UL,float用f或者F结尾,前缀为0则为八进制,0x为十六紧张。
- 转移字符,\a,\n等、\ooo,o代表1-3个八进制的数字,\xhh,h代表一个或者多个十六进制数。
- 常量表达式,只包含常量的表达式。
- const限定符指定的变量的值不能被修改,其指定的数组所有元素的值不能被修改。
- 类型转换: 自动转换,窄到宽,不会丢失信息。例如在计算a+b时,如果a为浮点型,b为int型,则会把b转换为float后再进行加法。
- & 按位与,一般用于置某位为0, | 按位或,一般用于某位置1,有符号数右移时候用符号为进行填充左边,无符号数用0填充。
三、控制流
好像没啥可记下来的
四 函数和程序结构
- 外部变量的初始化只能出现在其定义中
- 头文件,我们可以把共享的部分集合在一起,这样就只需要一个副本。在需要使用该头文件时,用
#include
包含即可。 - static,静态变量,static作用于外部变量和函数时,可以将其声明的对象限定在当前文件中,这样就无法被其它文件调用,当static修饰自动变量(局部变量)时,它的值一直存在,且只要在第一次进入程序时被初始化一次。
- 寄存器变量,使用频率较高的变量。
register int x
。编译器可以忽略过量的或者不支持的寄存器变量,并且他的地震是不能被访问的。 - 未进行显示初始化时,外部变量和静态变量都回被初始化0,
- 数组的初始化可以在声明的后面紧跟一个初始化表达式列表
int num[] = {1,2,3,4,5}
,当忽略数组的长度时,编译器会把花括号中初始化表达式的个数作为数组的长度,当初始化表达式个数 < 数组的元素时,剩余的元素会被初始化0. - 预处理器
# include //文件包含,可以用“”,也可以用<>
# define 名字 替换文本, //宏替换。当参数名以#作为前缀时,则会被转化为字符串
# undef // 可以取消名字的宏定义
#if ... #endif
五、指针和数组
- 指针是能够存放一个地址的一组存储单元,一般是两个或者四个字节。
- 一元运算符&可用于取一个对象的地址
p = &c
,把c的地址赋值给变量p,此时p为指向c的指针。- 一元运算符*是间接寻址或间接引用运算符。
- 指针只能指向某种特定类型的对象,每个指针都必须指向某种特定的数据类型,void类型的指针除外。
-
- 和 & 比算术运算符的优先级要高
- (ip)++的括号不能丢,因为和++需要遵从从右到左的结合顺序。
- 用指针访问数组时,比用下标访问快,因为用下标访问也会转成指针进行访问。
- 数组名代表的是该数组最开始的一个元素的地址。
- 对指针有意义的初始化值只能是0或者表示地址的表达式
- 如果指针p和指针q指向同一个数组的成员,那么他们可以进行== != < >=的关系比较,指向不同数组的元素的指针直接的算术或者比较运算没有定义。
- 字符串常量占据的存储单元数会比字符数大1,因为会加\0结尾。
char *p = "now is the time"
, 这时p指向一个字符串常量,他可以被修改指向其他的变量,但是无法修改字符串的内容是不行的。- 指针数组是数组,他的元素是指针,例如
int *num[5]
,num是一个含有5个元素的数组,他的元素是指向int的指针 - 二维数组实际上是一种特殊的一维数组,它的每个元素都是一个一位数组。
- 把二维数组作为参数进行传递时,必须在声明中指明列数,行数没有关系。
- 与二维数组相比,指针数组的好处在于每一行的元素可以不同。
六、结构体
- typedef 声明并没有创建一个新类型,他只是给一个村庄的类型增加一个新的名词
- typedef 是由编译器进行解释的,因此处理能力比预处理器强
- 联合中,长度为其中类型的最大值
七、输入和输出
- 在标准输入输出中,回车符和换页符都会被转化为换行符
- 可以使用 < 来实现输入重定向,> 实现输出重定向
- 可以通过管道重定向输出到另外程序的输入中,例如
peo | anotherprog
- 格式字符串包括两种类型的对象:普通字符和转换说明,默认靠右对齐,使用-时靠左对象,小数点之前表示宽度,小数点只会表示精度。
- sprintf 会将结果保存到string中,而不是打印。
- 文件访问时,必须有借有还,及时释放