初学者-C语言基础学习
文章平均质量分 78
初学者-C语言基础学习
寒寒豆豆软件公司
句容市寒寒豆豆信息技术有限责任公司
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C 语言学习坚持百日基本功-文件操作-31
"rb" | 二进制读 | 以二进制模式打开已存在文件,仅读取 | 读取图片、音频、二进制数据 | 无换行符转换(`\n`≠`\r\n`),按原始字节读取 |- **流(Stream)**:C语言将文件抽象为“字节流”,分为**文本流**(按字符编码存储,含换行符等特殊处理)和**二进制流**(按原始字节存储,无格式转换)。原创 2025-12-07 06:46:56 · 416 阅读 · 0 评论 -
C 语言学习坚持百日基本功-常见动态内存错误-30
野指针的核心危害是:对野指针的解引用(`*ptr`)会触发**未定义行为**——轻则程序崩溃(段错误`Segmentation Fault`),重则修改随机内存地址的数据,导致程序逻辑混乱、数据损坏,甚至成为黑客利用的漏洞。四类错误的本质均是**违背了堆内存的“申请-使用-释放”生命周期规则**:内存泄漏是“只申请不释放”,野指针是“使用已释放/未分配的指针”,重复释放是“释放已释放的内存”,缓冲区溢出是“越界使用已分配的内存”。`realloc`调整内存大小时,若失败会返回`NULL`,但原指针仍有效;原创 2025-12-07 06:46:38 · 406 阅读 · 0 评论 -
C 语言学习坚持百日基本功-动态内存管理-29
C语言标准库(`stdlib.h`)提供了4个核心函数实现动态内存管理:`malloc`、`calloc`、`realloc`、`free`,部分编译器还扩展了`alloca`(栈上动态分配),本文重点讲解标准函数。4. **使用`sizeof`计算类型大小**:避免硬编码字节数(如`malloc(5*sizeof(int))`而非`malloc(20)`);- **参数**:`ptr`为已分配的内存指针(`malloc/calloc/realloc`返回的指针),`new_size`为新的字节数;原创 2025-12-07 06:46:26 · 355 阅读 · 0 评论 -
C 语言学习坚持百日基本功-枚举-28
C语言中的枚举是一种**整数类型的别名**,枚举类型的变量本质上存储的是整数,枚举常量(枚举成员)本质上是编译期确定的整数常量。枚举常量是编译期常量,可用于预处理指令(如`#if`、`#ifdef`),但需注意:枚举常量不是宏,`#ifdef`无法检测枚举常量是否定义,需用`#if`判断值。5. **赋值类型限制**:枚举常量的赋值必须是**整数常量表达式**(编译期可计算的整数,如字面量、宏常量、其他枚举常量),不能是变量、浮点数或运行期计算的值。原创 2025-12-07 06:46:15 · 295 阅读 · 0 评论 -
C 语言学习坚持百日基本功-联合体-27
联合体(Union)是C语言中一种特殊的聚合数据类型,与结构体(Struct)同属自定义复合类型,但核心特性截然不同。**联合体的所有成员共享同一块内存空间**,其大小等于最大成员的大小(若存在内存对齐需求,需满足对齐规则)。| 内存分配 | 成员各自占用独立内存,总大小为各成员大小之和(含对齐) | 所有成员共享同一块内存,总大小为最大成员大小(含对齐) |printf("sizeof(U1) = %zu\n", sizeof(union U1));原创 2025-12-07 06:46:05 · 410 阅读 · 0 评论 -
C 语言学习坚持百日基本功-结构体-26
结构体(`struct`)是C语言中核心的自定义数据类型,也是面向过程编程中实现“数据封装”的关键手段,更是理解后续C++类(`class`)的基础。此时,`struct Student`成为一个新的“复合数据类型”,与`int`、`char`地位等价,可用于定义变量、数组、指针等。结构体中的指针成员(如`char *name`)赋值时,仅拷贝指针地址,而非指向的内容,导致“浅拷贝”(多个结构体共享同一块内存)。- 整体对齐:最大成员是`struct A`(8字节),总大小需是8的倍数。原创 2025-12-07 06:45:52 · 395 阅读 · 0 评论 -
C 语言学习坚持百日基本功-指针进阶-25
*关键解析**:如果函数参数是`int *ptr`,则函数内修改的是`ptr`的副本,主函数的`p`不会变化;只有传递`&p`(二级指针),才能通过`*ptr`修改主函数`p`的指向。` |**解析**:函数`get_ptr`执行完毕后,栈帧被销毁,局部变量`a`的内存被回收,此时`p`指向的地址已不属于程序合法内存,解引用会读取垃圾值。**解析**:数组`arr`仅占用3个int的内存,`p+3`和`p+4`指向数组外的栈内存,修改这些地址的数据可能覆盖其他变量,导致程序逻辑混乱。原创 2025-12-07 06:45:41 · 253 阅读 · 0 评论 -
C 语言学习坚持百日基本功-指针与函数-24
*关键**:若仅传递`char *str`(一级指针),函数内`str = malloc(...)`仅修改形参指针,主调函数的`msg`仍为`NULL`;**说明**:`setTimer`模拟异步操作,延迟指定时间后调用外部传入的回调函数,实现了“触发-回调”的异步逻辑,这是操作系统、框架中回调函数的典型用法。// 输出:swap函数内:*x=20, *y=10。**原因**:`swap`函数的`x`、`y`是`main`函数中`a`、`b`的拷贝,函数内部仅修改了拷贝值,原变量`a`、`b`未受影响。原创 2025-12-07 06:45:31 · 445 阅读 · 0 评论 -
C 语言学习坚持百日基本功-指针与数组-23
基于加法交换律,`arr + i`等价于`i + arr`,因此`*(i + arr)`等价于`arr[i]`,甚至可以写成`i[arr]`(语法合法,但可读性极差,不推荐使用)。| 元素 | arr[0][0] | arr[0][1] | arr[0][2] | arr[1][0] | arr[1][1] | arr[1][2] |下标法的本质是“地址偏移”:`arr[i]` 等价于“数组首地址向后偏移`i`个元素的地址所指向的值”——这一本质直接关联到指针访问数组的方式。原创 2025-12-07 06:45:21 · 254 阅读 · 0 评论 -
C 语言学习坚持百日基本功-指针概念-22
NULL`是C语言标准定义的宏(`#define NULL ((void *)0)`),表示指针不指向任何有效的内存地址。`:变量`p`占用另一块内存(比如地址0x7ffeefbff5c8),存储的值是`a`的地址(0x7ffeefbff5c4)。指针的大小是初学者极易混淆的知识点:**指针变量本身的大小,与它指向的类型无关,仅由系统的地址总线位数决定**。- 由于`p`的类型是`int *`,编译器会从该地址开始读取4个字节(int的大小)的数据,解析为整数。// 输出8(64位)/4(32位)原创 2025-12-07 06:45:11 · 321 阅读 · 0 评论 -
C 语言学习坚持百日基本功-函数-22
参数列表 | 函数接收的输入参数,格式为“类型1 参数名1, 类型2 参数名2, ...”,无参时可为空或`void` | `int a, int b`、`char *str`、`void` || return语句 | 有返回值函数:`return 表达式;`(可选) | `return a + b;| 返回类型 | 指定函数执行后返回值的类型,无返回值时用`void` | `int`、`float`、`char*`、`void` |原创 2025-12-07 06:44:50 · 395 阅读 · 0 评论 -
C 语言学习坚持百日基本功-字符串-21
示例 | `char arr[5] = {'H','e','l','l','o'}` | `char str[6] = {'H','e','l','l','o','\0'}` |2. **结束符是识别标志**:`'\0'`是字符串的“终止信号”,C语言字符串处理函数(如`strlen`、`strcpy`)均通过检测`'\0'`确定字符串边界;C is great!| 存储字符 | `'H'` | `'e'` | `'l'` | `'l'` | `'o'` | `'\0'` |原创 2025-12-07 06:44:32 · 383 阅读 · 0 评论 -
C 语言学习坚持百日基本功-二维数组-20
元素 | arr[0][0] | arr[0][1] | arr[0][2] | arr[1][0] | arr[1][1] | arr[1][2] |4. **数组名的双重身份**:二维数组名是指向“行数组”的常量指针,如`arr`指向`arr[0]`(第0行的一维数组),`arr[i]`指向第i行的第一个元素。| `arr[i][j]` | `int` | 第i行第j列的元素 | `*(*(arr+i)+j)` |// 0,(2,1)原创 2025-12-06 07:22:01 · 351 阅读 · 0 评论 -
C 语言学习坚持百日基本功-一维数组-19
1. **命名规范**:数组名使用名词复数(如`scores`、`students`),下标用`i`/`j`/`index`;2. **下标从0开始**:第一个元素的下标为0,最后一个元素的下标为`长度-1`(如长度为5的数组,下标范围0~4);// 输出找到9,下标:3。- **数据类型**:数组元素的类型(如`int`、`char`、`float`、`double`,或自定义结构体);- **类型一致性**:所有元素必须是同一数据类型(如`int`、`char`、`float`),确保内存布局固定;原创 2025-12-06 07:21:51 · 386 阅读 · 0 评论 -
C 语言学习坚持百日基本功-循环结构-18
while(1)`是C语言中最常见的死循环写法,需通过`break`、`return`、`goto`或外部信号(如`SIGINT`)退出,适用于持续运行的程序(如服务器、嵌入式系统)。`break`的核心作用是**立即终止当前所在的循环**(`while`/`for`/`do-while`)或`switch`语句,嵌套循环中仅跳出当前层循环。`break`、`continue`、`goto`是控制循环流程的关键语句,可灵活调整循环的执行路径,是实现复杂循环逻辑的核心工具。原创 2025-12-06 07:21:41 · 353 阅读 · 0 评论 -
C 语言学习坚持百日基本功-流程控制-17
流程控制是程序设计的核心骨架,它决定了代码的执行顺序、分支走向和循环逻辑。C语言作为结构化程序设计的经典语言,提供了三类核心流程控制机制:**顺序结构**(默认执行逻辑)、**分支结构**(条件判断)、**循环结构**(重复执行)。3. **副作用操作**:部分语句(如`a++`、`printf()`)除了核心功能外,还会产生“副作用”(修改变量、输出内容),需注意执行顺序。2. **死循环**:若条件始终为真(如`while(1)`),需在循环内通过`break`/`return`/`goto`退出;原创 2025-12-06 07:21:30 · 308 阅读 · 0 评论 -
C 语言学习坚持百日基本功-stdio.h-16
**MSVC**:提供`_fopen_s`/`_scanf_s`等安全函数(强制参数检查),扩展`_setmode()`(设置文本/二进制模式)。1. **检查所有I/O函数的返回值**:`fopen()`/`fread()`/`fwrite()`/`fclose()`等必须检查返回值;- **C99**:新增`snprintf()`、`vsnprintf()`、宽字符I/O函数(`fwprintf`/`fwscanf`);` 声明一个文件指针,并关联到`test.txt`文件的读流。原创 2025-12-06 07:21:18 · 268 阅读 · 0 评论 -
C 语言学习坚持百日基本功-运算符优先级与结合性-15
a = b = c` 等价于 `a = (b = c)`,意思是先把 `c` 的值赋给 `b`,然后再把 `b` 的新值(也就是 `c` 的值)赋给 `a`。| 14 | `=` `+=` `-=` `*=` `/=` `%=` `<<=` `>>=` `&=` `^=` `|=` | 右 | 赋值运算符 || 7 | `==` `!原创 2025-12-03 07:20:09 · 442 阅读 · 0 评论 -
C 语言学习坚持百日基本功-条件运算符-14
在实际开发中,应根据具体场景合理选择使用条件运算符或`if-else`语句,以平衡代码的简洁性和可读性。:)是一种简洁高效的三元运算符,它提供了一种在两个表达式之间根据条件选择执行的方式。- **工作原理**:如果条件表达式的值为真(非0),则整个表达式的值为`表达式1`的值;| 语法形式 | 表达式,可嵌套 | 语句块,可包含复杂逻辑 || 适用场景 | 简单的二选一赋值 | 复杂的条件判断和执行逻辑 |原创 2025-12-02 06:44:36 · 356 阅读 · 0 评论 -
C 语言学习坚持百日基本功-逻辑运算符-13
`&&` | 逻辑与 | 两表达式都为真时,结果为真;| 维度 | 逻辑运算符(`&&`、`||`) | 位运算符(`&`、`|`) |- 冗余写法:`if (a > 5 || a > 3)` → 简化为 `if (a > 3)`(因为 `a > 5` 是 `a > 3` 的子集)。C语言中,`&&`(逻辑与)和 `&`(按位与)、`||`(逻辑或)和 `|`(按位或)是完全不同的运算符,但初学者容易混淆。原创 2025-12-01 07:19:14 · 410 阅读 · 0 评论 -
C 语言学习坚持百日基本功-关系运算符-12
但这个特性在实际使用中很少直接体现,因为连续使用关系运算符的情况(如 `a < b < c`)在C语言中的行为可能不符合你的直觉(它会被解释为 `(a < b) < c`,而不是数学上的 `a < b 并且 b < c`)。* 使用 `<`, `>`, `<=`, `>=` 是**未定义行为(Undefined Behavior)**。如果为**零**,则不执行。| `==` | 等于(Equality) | `a == b` | 判断a的值是否**等于**b的值 |原创 2025-11-30 08:28:51 · 376 阅读 · 0 评论 -
C 语言学习坚持百日基本功-自增自减运算符-11
在现代编译器的优化下(例如开启 `-O2` 或 `-O3` 优化级别),对于简单的表达式,`++i` 和 `i++` 生成的机器码通常是**完全相同**的。自增(`++`)和自减(`--`)运算符是 C 语言中最具代表性的特性之一,它们不仅是语法上的简化,更体现了 C 语言设计中“追求效率”的核心理念。5. **理解而非死记**:不要死记硬背 `i++` 和 `++i` 的区别,要深入理解它们在表达式求值过程中的不同阶段(是先更新变量还是先返回值),这样才能在任何情况下都做出正确的判断。原创 2025-11-29 06:55:15 · 315 阅读 · 0 评论 -
C 语言学习坚持百日基本功-赋值运算符-10
*注意:** 在条件语句中使用赋值时,为了避免与相等性判断 (`==`) 混淆,**强烈建议**将赋值表达式用括号括起来,如 `(ch = getchar())`。因此,`x *= y + z` 总是被解析为 `x = x * (y + z)`,而不是 `x = (x * y) + z`。* 复合赋值运算符 (`+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `|=`, `^=`, `<<=`, `>>=`) 提供了更简洁的写法。等价于 x = (y = (z = 100));原创 2025-11-28 07:22:19 · 383 阅读 · 0 评论 -
C 语言学习坚持百日基本功-算术运算符-9
printf("乘法溢出:%d * %d = %d\n", large_num, large_num, overflow);printf("混合类型除法:%d / %.1f = %.2f\n", 10, 3.0, div_float2);// 输出:3.33。printf("前缀自增:a = %d, prefix = %d\n", a, prefix);// 输出:a=6, prefix=6。printf("浮点数除法:%.2f / %.2f = %.2f\n", c, d, div_float1);原创 2025-11-27 05:40:32 · 421 阅读 · 0 评论 -
C 语言学习坚持百日基本功-变量定义与初始化-8
整型:适用于存储整数,包括`int`(默认整型)、`short`(短整型)、`long`(长整型)、`long long`(超长整型),以及对应的无符号类型(`unsigned`前缀)。危害:C语言未规定不同源文件中全局变量的初始化顺序,若`x`的初始化先于`y`,则`y`的初始值为0(静态存储区默认值),导致`x`的初始值为1(而非预期的6)。- 浮点型:适用于存储小数,包括`float`(单精度浮点型)、`double`(双精度浮点型)、`long double`(长双精度浮点型)。原创 2025-11-26 05:59:53 · 359 阅读 · 0 评论 -
C 语言学习坚持百日基本功-基本数据类型-7
1. 小类型向大类型转换(如`char`→`int`→`long`→`long long`,`float`→`double`→`long double`)3. 浮点数的字面量默认是`double`类型,如需表示`float`或`long double`,需添加后缀`f`或`L`此外,C99及以后标准新增了**布尔类型**(`_Bool`),虽然它是基于整数类型实现的,但通常被视为基本数据类型。1. **整数类型**(`int`、`short`、`long`、`long long`、`char`)原创 2025-11-25 05:48:42 · 303 阅读 · 0 评论 -
C 语言学习坚持百日基本功-注释、分号、缩进、可读性规范-6
在软件开发中,编码规范是一套统一的规则和指南,用于指导开发者编写一致、可读、可维护的代码。C语言支持两种注释方式:单行注释(//)和多行注释(/* ... */)。良好的编码规范是高质量C语言程序的基础,注释、分号、缩进和可读性规范作为编码规范的核心组成部分,直接影响代码的质量和可维护性。// 圆周率常量(行尾注释)int calculate_sum(int x, int y) { // 计算两个数的和。// printf("调试信息:radius = %f\n", radius);原创 2025-11-24 06:23:02 · 301 阅读 · 0 评论 -
C 语言学习坚持百日基本功-#define定义宏常量-5
/ 替换过程: CUBE(x) -> (SQUARE(x) * x) -> (((x)*(x)) * x) -> (((3)*(3)) * 3) -> 27。`#define` 经常与预处理器的条件编译指令(`#if`, `#ifdef`, `#ifndef`, `#elif`, `#else`, `#endif`)结合使用。// 替换过程: D -> (C*2) -> ((A+B)*2) -> ((10+20)*2) -> 60。原创 2025-11-23 06:40:07 · 313 阅读 · 0 评论 -
C 语言学习坚持百日基本功-标识符体系-4
**输入输出 (I/O)**: `printf`, `scanf`, `getchar`, `puts`, `fopen`, `fclose`, `fprintf`, `fscanf`理解并熟练运用标识符的**命名规则**、**关键字**、**预定义标识符**以及**命名规范**,对于编写健壮、可读、可维护的 C 语言程序至关重要。* `true`, `false`:布尔常量 (C99 新增,定义在 `<stdbool.h>` 中,`true` 为 `1`,`false` 为 `0`)。原创 2025-11-22 07:24:19 · 366 阅读 · 0 评论 -
C 语言学习坚持百日基本功-Hello World-3
**基本类型**:`int`(整数)、`float`(单精度浮点数)、`double`(双精度浮点数)、`char`(字符)3. 点击 **文件(F)** → **保存(S)**,文件后缀名为 `.c`(例如 `hello.c`)1. 点击菜单栏 **运行(R)** → **编译并运行(C)**(或按快捷键 **F11**)1. 点击菜单栏 **文件(F)** → **新建(N)** → **源代码(S)**1. 点击菜单栏 **文件(F)** → **新建(N)** → **项目(P)**原创 2025-11-22 07:23:51 · 849 阅读 · 0 评论 -
C 语言学习坚持百日基本功-IDE使用-2
**编译成功信息**:如果编译和链接都成功,会显示类似 `Successfully compiled` 和 `Successfully linked` 的信息,并告知生成的可执行文件 (`.exe`) 的路径和大小。* **括号匹配 (Brace Matching)**:当你将光标放在一个括号(`{`、`}`、`(`、`)`、`[`、`]`)上时,与之匹配的另一个括号会高亮显示,帮助你检查代码结构。* **编译器选项 (Compiler Options)**:**全局编译器设置**。原创 2025-11-21 05:28:24 · 223 阅读 · 0 评论 -
C 语言学习坚持百日基本功-IDE介绍-1
常用的文件读写函数有 `fgetc()`、`fputc()`、`fgets()`、`fputs()`、`fscanf()`、`fprintf()`、`fread()` 和 `fwrite()` 等。1. **结构体**:结构体是一种构造数据类型,它可以将不同数据类型的元素组合在一起,形成一个新的数据类型。2. **数据类型**:C语言提供了多种数据类型,包括基本数据类型(如 `int`、`float`、`char` 等)和构造数据类型(如数组、结构体、共用体等)。指针的声明方式为:`数据类型 *指针名;原创 2025-11-21 05:28:08 · 266 阅读 · 0 评论
分享