C 存储类别

存储的基本概念

  1. 对象
    存储值的物理内存

面向对象编程的对象指的是类对象,c不是面向对象编程的语言。

  1. 标识符
    指定特定对象的内容

描述对象与标识符的方法:

1. 作用域->程序中可访问标识符的区域

以块(花括号{}为一个块)来划分
声明在内层块中的变量,作用域只限定于声明变量的块。

名称含义
块作用域从块开始到块结束
函数作用域声明在函数中的变量能作用于这个函数
函数原型作用域int Func(int,int)从形参声明到函数原型结束,所以声明时函数参数无关紧要。
2.链接->指定标识符的私有(可见)范围
  1. 内部链接
    内部链接指在此变量的作用域下只有所在的部分可以访问。

例如文件作用域,那么内部链接只有此翻译单元内的函数可以访问它
函数作用域会如何?!事实上我们说链接作用域只有文件作用域

  1. 外部链接
    所有在此作用域的部分都可以访问。
3.存储期->对象的生产周期
名称含义
静态存储期程序执行期间一直存在
线程存储期线程执行期间一直存在
自动存储期从块开始到块结束(变长数组从声明开始)

变量的存储类别:

那么,描述对象和标识符的三个方法组合起来,构成了下面5种存储类别。

存储类别存储期作用域链接表达方式
自动自动块内
寄存器自动块内,使用关键字register
静态外部静态文件外部所有函数外
静态内部静态文件内部所有函数外,使用关键字static
静态无链接静态块内,关键字static

那么这些存储类别的变量,根据存储期、作用域与链接三个方法可以得出这些存储类别的特点以及使用方法。

  1. 自动变量
    块开始到块结束这段时间变量存在,在这个块内可以被访问(看到)。
  2. 寄存器变量
    和自动变量的定义完全相同,但寄存器变量访问更快。但不能寻址
  3. 块作用域的静态变量
    通常把块作用域,无链接的静态变量称为静态变量
    在块作用域中可见,没有链接,程序结束前都存在。
void Func(void){
int fade=1;
static int state=2;
printf("fade=%d and state=%d",fade++,state++)

以上代码块中,第3行的声明其实并不属于这个函数,静态变量和外部变量在载入内存时已执行完毕,把这条语句放到这里意思是只有这个函数可以看到这个变量。

  1. 外部链接的静态变量
    该类别有时候被称为外部存储类别,属于该类别的变量被称为外部变量。
    为了指明函数使用了其他文件的外部变量,可以用extern声明
    当使用的外部变量在另一个文件中定义时,必须用extern声明
  2. 内部链接的静态变量
    只能被定义处的文件访问,而不能被其他文件访问。作用域范围为文件作用域。

静态链接和内部链接的静态变量区别就是作用域不同,前者是针对于块作用域而后者为文件作用域!

函数的存储类别

函数存储类别也有外部函数(默认),静态函数以及内联函数。

int Func(double);//默认为外部函数
extern Func1(double);//显式定义为外部函数
static int Func2(int,int);//定义为静态函数

外部函数可以被其他文件访问,而静态函数之内用于定义了它的文件访问。

来写一个随机数种子结束这一块内容!

#include<stdio.h>
#include<time.h>
static unsigned long int ne;
unsigned rand0() {
 ne = ne * 1103515245 + 12345;
 return (unsigned int)(ne / 65536) % 32786;
}
void seed1(int seed) {
 ne = seed;
}
int main() {
 seed1(time(0));
 for(int i=0;i<4;i++)
  printf("%d\n",rand0());
}

time()包含在头文件time.h中,time()接受一个time_s类型的参数,可以用空指针来初始化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值