Booknote,<C Primer Plus>
速成回顾, learnxinyminutes-c lang
C语言经典书, 通过关键插图或代码块记录这本书的精华。
第一个C语言程序, #include<stdio.h> 表示引入标准IO库的头文件。
接下来定义了返回值为int的 main函数。
main函数也是应用程序的入口函数,main函数内部再调用其它函数。
参考下图, Anatomy of a C program.
Question>>为什么IO这么基础的操作还要额外导入,C为什么不直接内置呢?
考量1:节简原则,并不是所有程序都要IO;
书中用的词是 The principle of economics
DataTypes in C:
为什么整数类型有short, long, unsigned short, unsigned long 和 int 这么多种类型?
fit the types to the machine
··· Windows, Apple 不同系统平台。
Picture, Difference Between C90, C99 and C11
Two_func, 在main函数调用
String & Char array
#define
定义常量的关键词,预处理 —— 编程程序时,所有 define的变量会被批量替换成指定的字面值,这个过程称为编译时替换(compile-time substitution)。
char name[40]
声明一个 长度为40的char数组。
scanf从标准输入中获取用户的输入,保存到name数组中😥。
strlen() vs. sizeof
sizeof(T) 可以返回T类型在运行的机器上占用多少个字节 , strlen方法返回这个string对象有多少个字符。 因为一个char占用一个byte,可能会想它们是相同的(对于一个char[]) 其实不然。
sizeof 作用于结构体时,不等于各分量的sizeof结果之和。
一般而言,以下断言不成立:// sizeof(struct rectangle) == sizeof(int) + sizeof(int)
这是因为structure成员之间可能存在潜在的间隙(为了对齐)
编译之前的预处理
define TAXRATE 0.015
while-循环
for-循环
尾递归 - Tail recursion
最简单的递归形式是把递归调用置于函数的末尾,即return 语句之前的位置。 这种递归称为尾递归。
指针:指向一个值为内存地址的变量(或数据对象)
指针要带有类型声明。
int * pi; 指向int类型的指针;
char * pc; 指向 char类型的指针;
float * pf; 指向float类型的指针。
在许多语言中,地址都不暴露给程序员。在C中,可以通过&运算符访问地址,通过*运算符获得地址上的值。
例如 &barn 表示变量barn的地址,使用变量名即可获得变量的数值。
数组和指针
数组名就是数组的地址头,索引[x]则表示顺着这个内存地址,访问到联排的地址。
内存管理(申请和释放), 存储级别
storage classes
storage duration 存储期, 对象在内存中保留了多长时间。
scope 作用域 、linkage 链接 表明程序哪些部分可以使用它。
不同存储级别具有不同的存储期、作用域和链接。
作用域, 块作用域、函数作用域、函数原型作用域或文件作用域。
- 块作用域, block scope 用 { } 圈起来的一个变量; 块内的局部变量
- for循环, while循环和if语句控制的变量,也是块的一部分。
- 文件作用域,变量定义在函数外面, 有点类似全局变量 global variable
malloc() and free()
内存的分配 (memory allocation) 是怎么回事?
int plates[100];
该声明预留了100个内存位置,每个位置都用于储存int类型的值。
内存的分配工具 malloc 函数 , 接收一个参数, 所需要内存字节数。 会找到一块匿名地址,返回动态分配内存块的首字节地址。
有申请就有释放,释放指令是free(地址)。
double * ptd;
ptd = (double *) malloc( 30 * sizeof(double));