C程序设计语言-美-里奇-C语言之父-机械工业出版社
我的思考
汇编语言中,程序分为多个段,数据段和代码段,我认为所有的语言大抵也是如此。以下这两点,是所有语言的基本。
- 数据段:数据类型和变量。汇编中的数据段中存放着不同长度的数据,C语言则有数据类型、数组。
- 代码段:表达式和流程控制。汇编中的代码段中有指令,如add ax, 1等等,C语言中则有表达式。汇编中的流程控制如jmp等则对应C中的if,for等流程控制语句。
其他C语言中的特性:
- 编译器伪指令%include:C语言中也有#include伪指令(预处理器指令)
- 符号常量:#define SUCCESS 1
- 声明和定义分离:因为C语言编译成可执行文件需要多个步骤:预编译、编译、汇编、链接。而只有最后一步才需要查找具体的实现(定义),所以声明和实现分离是比较好的,即分为.h和.c文件
- 外部变量:extern,跟函数的声明有相同的作用,链接之前不会找他的实现(定义)。
C预处理器
源文件的开始处通常都会有多个#include指令,它们用以包含常见的#define语句和extern声明。或访问库函数声明,如
指针
&符号取地址,*符号取地址对应的值。指向void的指针(void*
)可以存放指向任何类型的指针。指针运算pointer++每次都指向下个数据,指针移动的距离是指针指向类型的长度。
指向函数的指针,*优先级低于(),所以void *comp()
表示comp函数范围了int指针,而void (comp*)()
表示comp是指向函数的指针。
结构体
使用点号.访问结构体中的内容。类似Java中的类。
struct point{
int x;
int y;
};
如果一个指针是指向结构体的指针,那么可以使用->
来访问属性。
struct point *rp;
rp->x;
rp->y;
类型定义typedef
C语言提供了typedef来定义新类型名,如typedef int Length;则Length和关键字int完全相同。
输入和输出
标准库头文件一般在/usr/include目录下。
启动一个C语言环境时,操作系统负责打开3个文件,它们分别是标准输入、标准输出、标准错误,他们在
#include<stdio.h>
main(){
int ch = getc(stdin);
putc(ch, stdout);
}
读取文件时,读取到末尾时会返回EOF,在
系统调用、POSIX、库函数
系统调用由操作系统提供,是用户程序与操作系统内核交互的桥梁。 POSIX规范是unix-like操作系统需遵循必须实现的接口,一般以库函数的形式提供。