C语言9--作用域,生命周期和修饰符

作用域,生命周期和修饰符

变量除了类型和数值的属性以外,还有两个重要的属性:作用域和生命周期(存储期)。
作用域决定了变量什么时候可以访问,什么时候不能访问。
生命周期(存储期)决定变量什么时候存在,什么时候不存在。

1.作用域(scope)
C语言中,标识符都有一定的可见范围,标识符的作用域包括了可以使用该标识符的所有语句。
软件开发中,尽量缩小标识符的作用域是一个基本原则。当一个标识符作用域超过它所实际需要的范围时,就容易对整个软件的命名空间产生污染,造成一些不必要的冲突和意外修改。

(1)变量的作用域
根据变量的作用域将变量分为三类:全局变量 局部变量 块变量

全局变量声明在所有函数之外。
未初始化的全局变量会被自动初始化为0
全局变量的作用域包含所在程序中的所有语句

局部变量是声明在函数内部的变量
局部变量的作用域包含所在函数中的所有语句
形参的作用域和局部变量一致

函数内部的大括号包含的内容叫语句块,声明在语句块中的变量叫块变量
块变量的作用域包含所在语句块中的所有语句

注:C语言允许全局变量,局部变量和块变量重名,使用时如果有作用域的冲突选择使用就近原则。但是不要在编程中使用同名的变量。
函数的作用域默认是全局函数

2.生命周期
全局变量的生命周期是整个程序运行期间。
局部变量(形式参数)在函数调用时创建,所在函数返回时销毁。
块变量的声明周期是它所在语句块运行期间,每次执行语句块都会创键新的块变量。

函数中存储的是代码,生命周期也是整个程序运行期间。

3.变量的修饰符
修饰符是一类关键字,可以在声明变量时使用:
修饰符 变量类型 变量名;

auto: 声明自动变量
局部变量默认是自动变量

static: 可以用来修饰静态变量和静态数组,staic影响的是生命周期和作用域
静态变量分为静态全局变量和静态局部变量。
静态局部变量的生命周期变为整个程序运行期间,
作用域还是函数内部的语句。
静态全局变量的生命周期还是整个程序运行期间,
作用域变为本文件的语句。
可以用来修饰静态函数,静态函数只能被本文件的函数调用

const: 可以用来修饰变量,被修饰的变量将不允许被赋值
这种变量必须进行初始化
这种变量的值有可能改变
const修饰指针:
const int *p_num;//指向的数据不能修改,地址本身可以修改-----常量指针
int const *p_num;//指向的数据不能修改,地址本身可以修改-----常量指针

int *const p_num;//指向的数据可以修改,地址本身不能修改-----指针常量

const int *const p_num;//指向的数据和记录的地址都不能修改

注:const修饰的指针常作为形参,目的是表示该函数不会对指针的某个部分进行修改

const也可以修饰函数,当返回值是一个普通类型的数据时,
这种修饰无作用。当返回值是一个指针,又不希望通过该返回值对 返回地址记录的数据进行修改时,可以用const修饰指针类型的返回值。
const int *res_ptr()
{
static int num = 20;
return #

}

//*res_ptr() = 100;//这种语法将不允许

4.程序在内存中的分段保存

代码段: 所有的语句代码保存在代码段,在程序运行期间大小不变,
而且不能被修改,字符串常量保存在该段
数据段: 保存所有的全局变量和静态变量,该段在程序启动时创建
在程序运行期间大小不变,也叫静态存储区
栈: 每个函数在栈去都有一段私有的区域(函数栈)
局部变量 形式参数 返回值 块变量都保存在栈区
栈在函数被调用时变大,函数返回时变小
栈的存储管理由系统完成,所以该区域也叫自动存储区
堆: 堆中数据的生命周期由程序员管理,也叫自定义存储区
分配和释放的时机完全由程序员决定,这段内存也叫动态分配内存
//使用动态分配内存函数需要包含stdlib.h头文件
1.分配 ----------- malloc calloc realloc
void *malloc(size_t size);
参数:
size - 要分配的动态内存的大小
返回值:
分配成功返回分配内存的首地址,失败返回NULL

//malloc分配地内存不初始化,calloc分配的内存会被初始化为0
void *calloc(size_t nmemb, size_t size);
参数:
nmemb - 分配的内存块数
size - 内存块的大小
返回值:
分配成功返回分配内存的首地址,失败返回NULL

//realloc的作用是重置动态内存的大小
void *realloc(void *ptr, size_t size);
参数:
ptr- 原动态内存首地址
size - 重新分配动态内存的大小
返回值:
分配成功返回分配内存的首地址,失败返回NULL

释放动态内存:
void free(void *ptr);
//参数就是要释放的动态内存,也就是malloc的返回值

注意事项:
动态内存的分配和释放要一对一出现,否则就会造成内存泄漏
对一片动态内存多次释放可能造成严重错误

释放动态内存的意义是将内存的使用权归还给系统
释放内存不会改变指针的指向
释放内存不会对内容进行任何修改,也不会将内存清0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值