速成回顾, 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));