低端存储内存c语言,小议C语言中数据的存储类型【喜欢那张内存图】

C语言中的一些说明和定义会用到存储类型这样一个概念,在C语言中存储类型会用到下述几个关键字:auto,static,register,extern。函数

看下面的简略图你们能够明确程序在进行存储时是分为三个区域的,分别为代码段,数据段和bss段,用于存储不一样类型和状态的变量,而运行起来系统会再为其添加2个段,一个是堆,一个是栈,而咱们手动进行的内存空间的申请是分配在堆区中的,栈区中存放的是程序在运行的过程当中产生出来的一些临时信息和数据。咱们依次来看一下这4个关键字的使用和区别。spa

a9e8513b65864c7c9c2e3855.html

auto存储类型说明的变量都是局部于某个程序范围内的,只能在某个程序范围内使用,一般在函数体内或函数中的复合语句里。C语言中,在函数体的某程序段内说明auto存储类型的变量时能够省略关键字auto。htm

如,有下述定义:继承

auto int k ;        //说明一个auto整型的k变量

int K ;        //省略了auto,说明一个auto整型的K变量

这2种定义方式是相同的,省略auto关键字也是咱们经常使用的方式。内存

static:称为静态存储类型,在C语言中,既能够在函数体内,也可在函数体外说明static 存储类型的变量。资源

在函数体内说明的static 存储类型的变量也是一种局部变量,与auto最大不一样点是:static存储类型的变量在内存中是以固定地址存放的,而不是以堆栈方式存放的;只要整个程序还在继续运行静态变量就不会随着说明它的程序段的结束而消失,static类型的变量只被初始化一次,且变量的值有继承性,如,有下面的程序段:get

void fun()

{

int i = 0; *

i ++;

printf(“%d\n” , i );

}

int main()

{

fun();

fun();

fun();

return 0;

}编译器

在主函数中3次调用fun函数,这时在终端上输出的内容为:

1

1

1编译

而咱们将程序更改一下,将带有*的语句换做:

static int i = 0;class

则程序在终端上的输出为:

1

2

3

这是static关键字的用法及特色。

register称为寄存器型,使用register关键词说明的变量主要目的是想将所说明的变量放入寄存器存储空间中,咱们知道寄存器数量有限,且位于CPU的内部,这样能够加快程序的运行速度。但正由于寄存器的资源相对较少,因此编译器会判断程序所指定的须要放在寄存器中的内容有没有必要放入寄存器中去,也就是说,编译器来决定是否将指定内容放入到寄存器中,若是没有没有必要放入寄存器中,就使用auto类型做处理。综上所述,register是一个建议性关键字,编译器能够判断出是否去执行这样一个关键字,因此这个关键字在目前的用处相对地减小不少,你们了解这样一点。

extern称为外部参照引用型,使用extern说明的变量是想引用在其它文件中或在函数体外部已经声明过的变量

这里会涉及到一个概念,叫全局变量,指的是在全部的函数外部声明的变量,所有变量做用于全局,在整个程序运行期间值都被保存,全局变量的做用范围是从其定义处开始,直至程序结束,而extern关键字的做用是对全局变量进行引用的声明。以下面的程序:

int a = 1;

int main()

{

printf(“a = %d\n” , a);

return 0;

}

该程序能够成功运行,输出a的值为1,而若是改变一下:

int main()

{

printf(“a = %d\n” , a);

return 0;

}

int a = 1;

这样在进行编译时,编译器会报错,提示变量a没有定义。也就是说全局变量的做用范围是从定义处开始直至程序结束,而咱们在该程序的基础上加上一句声明:

extern a;

int main()

{

printf(“a = %d\n” , a);

return 0;

}

int a = 1;

加上一个extern的说明后,该程序能够正常编译执行,在这里要注意extern关键字对于变量的类型说明能够省略,但对于变量的类型及值是没有任何改变权限的,也就是说在上面例子中的extern语言若是写成exter float a;或者是extern int a = 3;编译时会提示错误。

因此extern对于变量的类型及值没有任何更改的功能,只能是对于外部变量的定义进行一个引用的声明,换句话说,它扩大了外部变量的做用范围,因此extern是一个说明性关键字,而不是定义性的,说明与定义的区别咱们能够来对比一下:

a9e8513b65864c7c9c2e3855.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值