学习记录:第二周day03笔记

函数传参

1、函数中定义的变量属于该函数,出了该函数就不能再被别的函数直接使用

2、值传递:实参与形参之间是以赋值方式进行传递数据的,并且是单向

3、return语句其实是把返回值数据放入公共区域内存中(调用者和被调用者都可以访问),调用者会从该区域获取返回值;如果不写return语句,该区域会是一个随机的垃圾数据,调用者也能拿到返回值但是无意义

4、数组作为函数的参数传递时,数组的长度会丢失,需要额外增加一个变量把数组的长度传递过去(实际传过去的是一个指针)

 void func(int a[],int len)//这里的int a[]其实就是int *a

5、数组作为参数传递,是“址传递”,相当于调用者与函数共享的数组

 

练习1:实现一个函数,找出数组中的最大值

练习2:实现一个函数,对数组进行排序

 

 

设计函数的准则:

1、一般一个函数最好不要超过50行,确保一个函数只负责完成一项功能,降低出错率,提高可读性

2、数据一般要由调用者提供,只把结果返回给调用者,确保函数的通用性

3、考虑调用者提供的一些非法数据,可以先判断后使用,也可以通过注释来写明情况,提高函数的健壮性

 

 

进程映像:

程序:存储在磁盘上的可执行文件(二进制文件、脚本文件)

进程:正在系统中运行的程序

进程映像:进程在内存中的分布情况

text 代码段(代码段+只读段)

存储的是二进制指令、常量,权限是只读,如果强制修改会产生段错误

data 数据段

初始化的全局变量、初始化过的静态局部变量

bss 静态数据段

未初始化的全局变量、未初始化的静态局部变量,在该段内存中的数据在程序开始会自动清为0

(所以即使将全局变量初始化为0,位置也不会发生变化)

stack

局部变量和块变量,会随着程序的进行不断地申请、释放,由操作系统管理,使用方便,但很小

heap

该段内存由程序员手动管理,使用麻烦,但足够大

 

局部变量和全局变量

全局变量:定义函数外的变量

存储位置:data(初始化)或者bss(未初始化)

生命周期:程序开始到程序结束

使用范围:程序任意位置都可以使用

局部变量:定义函数内的变量(包括形参)

存储位置:stack 栈内存

生命周期:从函数开始到函数结束

使用范围:只能在该函数内使用

块变量:定义在if/for/while等语句块内的变量

存储位置:stack 栈内存

生命周期:从语句块开始到语句块结束为止

使用范围:只能在语句块内使用

注意:局部变量会屏蔽同名全局变量

块变量会屏蔽同名的局部变量和全局变量

因此建议全局变量首字母大写,局部变量全部小写

 

 

类型限定符

auto

用于定义自动申请、自动释放的变量(局部变量,不加代表加)

注意:C11语法标准中用于自动类型识别

注意:不能用它修饰全局变量

extern(用于多文件编程)

用于声明外部变量,告诉编译器此变量在程序的其他地方已经定义,先让程序通过编译,如果在链接时找不到变量依然会报错

static

改变局部变量存储位置:

由stack改为data(初始化)或者bss(未初始化)

延长局部变量生命周期:

直到程序结束才释放

限制全局变量作用范围:

只能在本文件内使用

注意:使用static修饰全局变量,可以防止该变量被别的文件使用,以防止命名冲突

const

"保护"变量的值不被显式修改

注意:如果通过内存进行修改,还是可以改的

注意:使用const修饰data段数据,那么该数据会存储到text段中,如果强制修改会段错误

volatile

C编译器会对普通变量的取值进行“取值优化”,只要使用变量使用过程中该变量没有显式改变,那么编译器会直接使用上一次结果,而不会每次都去内存读取数据

加上volatile,让编译器不要对该变量进行“取值优化”

一般在驱动编程、硬件编程、多线程编程时使用

register

存储介质

硬盘-》内存-》高级缓存-》寄存器-》CPU

申请把变量的存储介质改为寄存器(原来在内存中),但是由于寄存器数量有限,不一定百分百成功

注意:寄存器变量不能取地址

typedef

类型重定义

在定义变量前,加上typedef,那么原本的变量名就变成了这种数据类型,就可以像数据类型一样定义变量

typedef int num

num n1;

posted @ 2023-04-18 10:33  菊里菊气  阅读(13)  评论(0编辑  收藏  举报