程序在执行前,系统会给程序分配内存空间,包括静态数据区,代码段,堆和栈,然后将程序中的常量和变量分别载入静态数据区的常量和变量区域,代码段用来存放程序的函数代码,程序中使用的malloc()和free()都是对堆的动态分配和释放的操作,而栈一般是在创建局部变量时由系统自动分配和释放的。 ### C语言学习笔记知识点梳理 #### 一、内存分配策略 1. **程序启动时的内存分配**:在程序执行之前,系统会为程序分配内存空间。这些内存空间主要包括四个部分: - **静态数据区**:用于存储全局变量、静态局部变量等,这部分内存会在程序启动时初始化并在整个程序运行期间一直存在。 - **代码段**:用于存储程序的机器码,即编译后的函数代码。 - **堆**:动态分配的内存区域,通过调用`malloc()`函数来分配内存,使用`free()`函数来释放内存。 - **栈**:用于存储函数调用时的局部变量和函数参数,以及函数调用过程中的临时数据。栈内存由系统自动管理,通常在函数执行完毕时自动释放。 2. **数据的装载**:程序中的常量会被加载到静态数据区的常量区域,变量则根据其作用域被装载到相应的区域。例如,全局变量和静态局部变量被装载到静态数据区的变量区域;局部变量则被装载到栈上。 #### 二、输入输出函数 3. **`scanf()`与`printf()`的使用**: - `scanf()`函数用于从标准输入设备(通常是键盘)读取数据,如果传入的不是指针变量或数组名称,那么需要在变量名前加上`&`符号,表示传递的是变量的地址。 - `printf()`函数用于向标准输出设备(通常是屏幕)输出数据,可以直接使用变量名进行输出,不需要加上`&`符号。 #### 三、自增自减运算符 4. **自增自减运算符的应用**:在表达式中使用自增自减运算符时需要注意它们的顺序。例如,在表达式`j = (++i) + (++i);`中,`i`会先递增再参与计算,而在`j = (i++) + (i++);`中,`i`会先参与计算然后再递增。 #### 四、`sizeof()`与`strlen()`的区别 5. **`sizeof()`与`strlen()`的区别**: - `sizeof()`用于计算对象或类型的字节大小,如果操作的对象是数组名,则返回的是整个数组的大小;如果是指针,则返回的是指针本身的大小。 - `strlen()`用于计算字符串的长度,即从第一个字符到最后一个字符(不包括结束符`\0`)之间的字符数量。对于非字符串指针,`strlen()`函数可能无法正确计算。 #### 五、`atoi()`函数原理 6. **`atoi()`函数的工作原理**:`atoi()`函数用于将字符串转换成整型数值。可以通过对字符串的每个字符进行解析并转换成数字,从而得到整个字符串代表的数值。例如,为了获取一个三位数的中间一位数字,可以使用`(int)(n % 100) / 10`的方式。 #### 六、循环控制与数组使用 7. **`continue`语句**:`continue`语句用于跳过当前循环体中的剩余语句,继续下一次循环。使用`continue`时,要注意确保循环变量在`continue`之后有变化,否则可能会导致无限循环。 8. **数组名的理解**:在C语言中,数组名实际上是一个指向数组首元素的指针。因此,可以将数组名看作是一个特殊的指针,可以对其进行加减操作。例如,`&a + 1`表示数组`a`后面的一个地址。 9. **随机数生成**:在C语言中,可以通过`srand((unsigned int)time(NULL));`函数初始化随机数种子,然后使用`rand()`函数生成随机数。为了获得一个指定范围内的随机数,可以使用`rand() % n + 1`的形式。 #### 七、函数参数与数组定义 10. **数组作为函数参数**:在C语言中,一维数组作为函数参数时,实际上传递的是数组首元素的地址。因此,可以在函数内部直接使用指针操作。 11. **二维数组初始化**:二维数组可以采用不同的方式进行初始化。例如,可以使用列表初始化的方式,也可以使用多行列表的方式进行初始化。两种方式都可以实现相同的效果。 12. **字符数组赋值**:在为字符数组赋值时,需要在最后一个字符后添加一个结束符`\0`,这标志着字符串的结束。 #### 八、动态创建二维数组 13. **动态创建二维数组**:可以通过以下步骤动态创建一个二维数组: - 首先分配一个指针数组`int **p = malloc(n * sizeof(int*));` - 然后为每个指针分配具体的内存`p[i] = malloc(n * sizeof(int));` - 最后使用完毕后记得释放内存`for (i = 0; i < n; i++) free(p[i]); free(p);` #### 九、字符串处理 14. **字符串处理注意事项**:`char *p = "nihao";`和`char s[] = "nihao";`的区别在于,前者指向一个常量字符串,不能修改;后者是一个字符数组,可以进行修改。 15. **输入输出函数使用建议**:`gets()`和`puts()`函数由于没有提供缓冲区大小限制,可能会导致缓冲区溢出问题,因此在实际编程中应尽量避免使用这两个函数。 #### 十、条件运算符与结构体定义 16. **条件运算符嵌套使用**:条件运算符可以嵌套使用,例如`grade = score >= 90 ? 'A' : (score >= 60 ? 'B' : 'C');`,这样可以根据不同的条件输出不同的结果。 17. **结构体定义**:在定义结构体时,通常会使用`typedef struct { ... } TypeName;`的形式,这种形式不仅简化了结构体的使用,也是商业软件开发的标准实践。 18. **清屏函数**:`system("clear")`或`system("clrscr")`可以用来清除屏幕输出,但是使用`system()`函数时需要注意安全问题。 19. **`limits.h`头文件**:这个头文件包含了各种数据类型的最大值和最小值定义,例如`INT_MAX`和`INT_MIN`等。 20. **`atoi()`函数的实现**:`atoi()`函数可以手动实现,通过对字符串中的每个字符进行解析并转换成数字,最终得到整个字符串所代表的整数值。
剩余28页未读,继续阅读
- 粉丝: 11
- 资源: 49
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- bfgbghjyujkyuh
- 基于Java的宠物狗销售系统的设计与实现.doc
- 废物垃圾分类检测41-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- gperftools依赖到的unwind库,用于c++性能分析
- 数据管理界面插件REPORT11
- 基于java的大学生二手书在线买卖系统论文.doc
- RabbitMQ 的7种工作模式
- 停电自动关机程序.EXE
- ODrive 固件 0.5.6
- 基于Java的电影订票网站的设计与开发毕业设计论文.doc
- 基于tensorflow和cnn做的图像识别,对四种花卉进行了分类项目源代码+使用说明,可识别:玫瑰花、郁金香、蒲公英、向日葵
- 探索CSDN博客数据:使用Python爬虫技术
- SSM技术助力创客教育:小码创客教学资源库的构建与实现
- 废物垃圾检测28-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- Java SSM框架在农产品质量安全检测网站中的应用
- 基于javaweb的动漫网站管理系统毕业设计论文.doc
评论0