# CS61C | lecture2
C 语言是一种编译语言。C 编译器将 C 程序映射到特定与体系结构的机器代码(实际上是一串 0 和 1)。
 而 Java 会通过 JVM(Java 虚拟机) 将代码转换为独立于架构的字节码。
 Python 则会直接解释代码。C 不会直接解释代码,而是将其编译成机器代码之后,CPU 直接解释并运行。
编译优点
C 的编译优势在于:
 1.有很出色的运行性能,通常比 Python 和 Java 快。
 2.编译的时候可以允许我们仅重新编译修改了的文件。
编译缺点
1.编译文件包括可执行文件是特定于体系结构的,也就是特定于 CPU 类型和操作系统类型。
 2.编译过程通常是 编辑、编译、运行 的重复
类型转换
C 是一种弱类型语言。
结构对齐与填充
struct foo {int a;char b;struct foo *c;
}
这段代码在 32 位架构上:
| 字节 | |
|---|---|
| a | 4 | 
| b | 1 | 
| unused bytes | 3 | 
| c | 4 | 
| sizeof(struct foo) | 12 | 
| 32 位计算机上的指针是 32 位,也就是 4 字节。 | 
Unions
union 可以让元素共享存储空间。同时会占用空间最大的元素提供了充足的空间。
./foo hello 87
| argv[0] | “./foo” | 
| argv[1] | “hello” | 
| argv[2] | “87” | 
| argv[3] | null | 
指针
将内存视为一个很大的数组,每个元素有个地址并且存储这一定的值。
 
 上图中,p 为指针,指向 x,所以要存储 x 的地址 104
 
 传统在函数中传递参数是通过复制参数的方式,不会对原始变量进行改变。但通过传递引用的方式可以进行修改。
void addOne(int *p) {*p = *p + 1;
}int main() {int y = 3;addOne(&y); /* y 将变成 4 */
}