C 语言
源代码
.h
- 头文件,用于声明接口和定义
- #define
- typedef
.c
程序主体部分,用来写函数实现。
基本类型
在一个 2字节 的存储单元中,存储单元中能存放最大的值为
0111 1111 1111 1111
最左边 0 代表 正数,1代表负数。即 10 进制下,最大值为 32767,最小值为 -32768.
无符号位 unsigned
如果不需要负数,则正数范围可以扩大1倍,即 10 进制下,最大值为 65535,最小值为 0.
默认情况下。整形变量都为 signed
enum 和 void
枚举类型 enum
- C编译对枚举类型的每一个元素按常量处理,AKA 枚举常量,他们不能看作变量,也不能对他们赋值
- 每一个枚举元素都代表着一个整数,编译时,按照定义的顺序 值从0开始。
- 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
这是标准输入、标准输出和标准错误输出的文件指针。默认打开,可以直接使用。