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/
作者
思源南路世一劈
发布于
2024年9月3日
许可协议