我是靠谱客的博主 长情纸飞机,最近开发中收集的这篇文章主要介绍c语言高级深入理解数据的存储类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我们在编写c语言的时候往往只是定义一个变量但是并不知道这个变量存储在哪里,什么时候失去作用,那是因为我们没有理解c语言的数据存储格式和存储区域,如果你不知道请看这篇文章

1.先来了解全局变量和局部变量

全局变量:在一个程序中定义在函数外部的变量,生命周期是从定义开始处到程序结束

局部变量:在函数体内定义或者在复合语句内部定义的变量,前者生命周期是整个定义处到函数结束,后者只在复合语句块内部

2.在c语言中一个变量有三种属性:数据类型,作用域,存储类型,前两者不再赘述,接下来说存储类型,存储类型决定了定义的变量在程序中的生命周期

一般c语言程序在内存中分成几个区来存储代码和数据

1.代码区:经过编译后的可以直接执行的机器代码

2.只读数据区:存储程序中不会被修改的数据,例如各种常量和符号常量等

3.静态存储区:全局变量和静态变量都存储在这里,初始化的变量存储在初始化数据区,没有的存储在未初始化数据区,未初始化的全局变量和静态变量系统赋值0或者"",这些变量在程序结束才释放,

4.动态存储区:堆和栈

堆:有程序员自己使用malloc()等函数申请的内存,这些内存如果不再使用应该由我们自己来释放,如果没有操作系统会帮忙回收

栈:函数中的形参和普通变量存放的地方,这些变量只有在函数调用的时候才分配内存,函数调用结束,内存马上释放

 根据变量的存储方式可以将变量分为:auto,static,register,extern四种不同类型的变量

1.auto

定义格式

auto        数据类型        变量表

auto变量是动态存储方式,作用域只在这个函数内部,一般可以省略,也就是大多数哦我们定义的变量都是动态变量,如果auto变量定义了,但是没有初始化,值是不确定的,如果初始化则实在函数调用时赋值,分配内存空间,每次函数调用都要重新位该变量分配空间并赋一次初值,并且在复合语句中定义的变量同样也是如此,举两个例子说明

1.

int
sum(int x,int y)
{
int sum=x+y;
return sum;
}
int main()
{
int a=1,b=1;
int ret=sum(a,b);
printf("%dn",ret);
return
0;
}

调用sum函数时再分配内存,调用完毕释放内存

static

再局部变量前面加上这个关键字,局部变量会成为一个局部静态变量,这样的变量和全局变量一样存储在静态存储区,这样的变量生存周期是整个程序,但是其他函数是不能使用的,静态变量定义了没有初始化会被赋值0或者""

int
sum(int x,int y)
{
static int sum=x+y;
//sum会存储值,函数调用结束并不会释放这个内存
return sum;
}
int main()
{
int a=1,b=1;
int ret=sum(a,b);
printf("%dn",ret);
return
0;

我们已经在知道全局变量存储在静态存储区内也就是说,全局变量的声明周期位整个程序,但是如果我们在全局变量前面加一个static会怎么样呢?在全局变量前你加了一个static只会限制这个变量只能被该文件使用,别的文件使用不了

register

可以用来定义一个寄存器变量,我们在写程序的时候,有些变量会被频繁使用到,如果我们把该变量定义在寄存器中,会加快我们的访问速度,但是不是所有的变量都可以是寄存器变量,只用形参和局部变量可以,局部静态变量都不行,使用这个关键字定义变量后,在和普通变量一样在函数被调用时为该变量在寄存器內部申请一段内存空间,结束释放就行

extern变量

修饰的变量可以被外部文件访问

扩展

内部函数和外部函数

一般我们在编写一个函数时,该函数是可以被外部其他的文件访问到的,但是这样可能会造成函数名字冲突所以我们在定义的函数前面加一个static修饰就可以,不加关键字默认为外部函数,但是在使用时需要提前声明

extern 函数类型   函数名1(参数表),函数名2(参数表)

最后

以上就是长情纸飞机为你收集整理的c语言高级深入理解数据的存储类型的全部内容,希望文章能够帮你解决c语言高级深入理解数据的存储类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部