C语言入门
CS61C-C语言入门
C语言基础语法上比较简单,我这里只记录一些我自己不会的地方。重点是后面的C语言内存管理与处理上
C基础语法
引入头文件的两种方式
- 使用<>:即在机器的C语言库里寻找相关库文件
- 使用””:引入工作目录里的头文件
关于bool
- C语言中没有bool这个变量类型
- 只有表示true/false的相关概念——
- 0和NULL表示false
- 其他全部表示true
- 事实上,C++里的布尔类型是一个已经定义好的枚举类型
位运算
可直接对数据的二进制位进行操作
typedef
可用于设置类型的别名,常与struct搭配使用
指针与数组
Pointer
指针可以视作指向一块内存空间的变量,存储这块空间的地址
定义指针变量使用*符号,若要定义任意指针,使用void *
指针还包括函数指针,用来指向一个函数,可以实现python中的高阶函数
Array
数组本质上就是一块连续的内存空间,因此与指针有异曲同工之妙
例如:char *即字符串,a[b]本质上即 *(a+b)
内存管理(Memory Manaegment)
内存位置
栈(Stack)
- 负责存储本地变量,函数参数
- 逐渐伸向较小的地址
堆(Heap)
- 负责存储动态分配的内存,如malloc,new等
- 逐渐伸向较大的地址
数据段(Data)
- 负责存储全局变量,字符串字面量
- 不改变大小
Text(Code)
- Program executable
- 不改变大小
处理内存的一些函数
void *malloc(size_t n)
声明一块n bits的动态内存,但是内部未经过初始化
void *calloc(size_t num, size_t size)
声明一块n*size bits的动态内存,并全部初始化为0
void *realloc(void *ptr, size_t size)
将ptr指向的地址重新声明为size bits的地址,并且没有初始化
void free(void *ptr)
释放ptr指针指向的内存
在C语言中,内存管理是非常重要的概念,不同于CS61B中的Java语言会自动帮你收集废弃的内存,C语言中每一块动态分配的内存都需要自己显式地释放掉。否则便有可能造成内存泄露等一系列后果
这一部分的Lab还教了gdb和valgrind的使用,简单贴个表在这里:
C语言入门
http://example.com/2024/09/03/61C-C/