Skip to main content

C 语言

源代码

.h

  • 头文件,用于声明接口和定义
  • #define
  • typedef

.c

程序主体部分,用来写函数实现。

基本类型

在一个 2字节 的存储单元中,存储单元中能存放最大的值为

0111 1111 1111 1111

最左边 0 代表 正数,1代表负数。即 10 进制下,最大值为 32767,最小值为 -32768.

无符号位 unsigned

如果不需要负数,则正数范围可以扩大1倍,即 10 进制下,最大值为 65535,最小值为 0.

默认情况下。整形变量都为 signed

enum 和 void

枚举类型 enum

  1. C编译对枚举类型的每一个元素按常量处理,AKA 枚举常量,他们不能看作变量,也不能对他们赋值
  2. 每一个枚举元素都代表着一个整数,编译时,按照定义的顺序 值从0开始。
  3. C99把枚举类型也视为整形数据的一种(用户定义的整数类型)

无类型 void

他不指向任何类型的数据,应当理解为指向空类型或者不指向确定的类型的数据。

派生

指针

为了有效的存取一个数据,除了需要位置信息外,还需要有改数据的类型信息。

一个变量的指针的含义包括两个方面,一方面是存储单元编号表示的纯地址(如编号为2000的字节),另一方面就是指向的存储单元的数据类型(如 int,char,float等)。

* 指针运算符,用来声明 或 使用指针

& 取地址运算符,用来取变量的指针

数组

[] 变址运算符

变量名是 arr[0] 的地址

字符串

// 初始化一个字符串
char str[10] = "wayne";

// 打印字符串
printf("str = %s", str);

字符串在char数组中,会有一个 \0 结束标记。

struct

和面向对象语言中的 class 类似。可以定义多个成员,内存空间的占用是所有成员占用的空间总和。

union

用来复用同一段空间而不受限于类型

function

AKA:

  • 函数
  • 算法
  • 方法
  • 功能

如果想要声明为内部方法,则用 static 修饰。默认为 extern。

NULL

NULL 地址指向为0,不等于未初始化

内存操作

malloc

malloc 分配长度为size的连续空间,返回一个指向这段内存空间的指针。

int *ptr = (int *)malloc(sizeof(int) * 10); // 分配10个int类型的空间
if (ptr == NULL) {
// 分配失败
printf("Memory allocation failed\n");
}

calloc

calloc 分配n个长度为size的连续空间,并将这段内存空间初始化为0。

int *ptr = (int *)calloc(10, sizeof(int)); // 分配10个int类型的空间并初始化为0
if (ptr == NULL) {}

free

释放之前分配的内存空间,防止内存泄漏。

free(ptr); // 释放之前分配的内存空间
ptr = NULL; // 避免悬空指针

realloc

realloc 用来重新分配之前分配的内存空间,可以扩大或缩小空间大小。

ptr = (int *)realloc(ptr, sizeof(int) * 20); // 扩大到20个int类型的空间
if (ptr == NULL) {
// 重新分配失败
printf("Memory reallocation failed\n");
}

文件

fopen

打开文件,返回一个文件指针。

FILE *fp = fopen("file.txt", "r"); // 打开文件,模式为只读
if (fp == NULL) {
// 打开失败
printf("File open failed\n");
}

模式有:

  • "r(b)" 只读模式
  • "w(b)" 只写模式
  • "a(b)" 追加模式
  • "r+" 读写模式
  • "w+" 读写模式,文件不存在则创建
  • "a+" 读写模式,文件不存在则创建

带不带 b 区别在于换行符处理, 但并不意味着自动转换数据到二进制。

写入的数据取决于写入的函数

fclose

关闭文件,释放文件指针。

会先把缓冲区写入到磁盘文件,成功返回0,否则返回EOF(-1)

fclose(fp); // 关闭文件
fp = NULL; // 避免悬空指针

二进制方式 fread / fwrite

用于读写二进制数据。

char buffer[100];
size_t bytesRead = fread(buffer, sizeof(char), 99, fp);
buffer[bytesRead] = '\0'; // 确保字符串以'\0'结尾
printf("Read %zu bytes: %s\n", bytesRead, buffer);
char buffer[100];
size_t bytesRead = fread(buffer, sizeof(char), 99, fp);
buffer[bytesRead] = '\0'; // 确保字符串以'\0'结尾
printf("Read %zu bytes: %s\n", bytesRead, buffer);

ASCII方式 fprintf / fscanf

fprintf(fp, "Write %zu bytes: %s\n", bytesRead, buffer);
fscanf(fp, "%99s", buffer);

字符串方式 fgetc / fputc / fgets / fputs

用于逐字符读写文件。

int ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch); // 输出字符
}
fputc('A', fp); // 写入字符'A'到文件

用于读取和写入一行文本。

char line[100];
if (fgets(line, sizeof(line), fp) != NULL) {
printf("Read line: %s", line);
}
fputs("Hello, World!\n", fp); // 写入一行文本到文件

文件指针 fseek / ftell

// 移动文件指针到文件开头
fseek(fp, 0, SEEK_SET);

// 获取当前文件指针位置
long pos = ftell(fp);
printf("Current file position: %ld\n", pos);

文件状态 ferror / feof

if (ferror(fp)) {
perror("File error");
} else if (feof(fp)) {
printf("End of file reached\n");
}

stdin / stdout / stderr

这是标准输入、标准输出和标准错误输出的文件指针。默认打开,可以直接使用。