属性关键字

属性关键字

1.C语言中的变量可以有自己的属性;

2.在定义变量的时候可以加上属性关键字;

3.“属性”关键字指明变量的特有含义;

autoC语言中局部变量的默认属性,C编译器默认所有的局部变量都是auto的;

auto指明一个变量在栈上分配空间;

Static关键字指明变量(局部变量和全局变量)在静态存储区分配空间,同时具有“作用域限定符”的意义。

Static修饰的全局变量的作用域只是在声明的文件中;

Static修饰的函数的作用域只是在声明的文件中;

Static除了指明变量分配的存储空间在静态区外,还作为文件作用域限定符,即它可以将变量或函数限定于定义的文件中,不可被外部访问,只有所定义的文件中的变量或函数才能引用static定义的变量或函数,所以外部的函数都不能访问用static定义的变量。

声明变量具有register存储类型的就要求编译器把变量存储在寄存器中,而不是像其他普通变量一样存储在内存中。

Register关键字指明将变量存储于寄存器中,但register只是请求寄存器变量,不一定请求成功。Register变量必须是寄存器可以接受的值;不能用&运算符获取register变量的地址。由于寄存器没有地址,所以对register变量使用取地址预算符是非法的。通常register变量有称为寄存器变量。寄存器变量时没有地址的。

寄存器变量的使用范围:使用在实时系统里,当对实时性要求非常高的时候,应当尽量使用寄存器变量;当一个函数可能被频繁的调用时,并且对运行的效率要求非常高时,我们应该使用寄存器变量。Register存储类型变量最好用于需要频繁进行访问或更新的变量。

系统从寄存器读取数据要比从内存读取数据要快很多倍。

全局变量是不允许存放在CPU寄存器中的,即寄存器变量只能是局部变量;同时全局变量也不允许放在栈上;也就是说:aotu类型变量和register类型变量只能定义局部变量,不能定义全局变量。

如下程序:

#include <stdio.h>

auto int m = 0;

register int n = 0;

int main()

{

    auto int i = 0;

    register int j = 0;

    static int k = 0;

    

    return 0;

}

以上程序,34行会报错,会分别提示“你试图将全局变量‘m’分配在栈空间”、“你试图将全局变量‘n’分配在CPU寄存器中”;

再如一下两个文件的程序:

a.c  

#include <stdio.h>

extern int i;

int main()

{

    printf("i = %d",i;)

    return 0;

}

b.c 

int i = 100;  

编译并运行以上两个文件的程序,printf会正确的输出i = 100;当把b.c文件的程序改为如下时:

b.c 

static  int i = 100; 

在进行编译a.cb.c文件,a.c文件的程序报错,提示i未定义;

综上所述:

1.auto变量存储在程序的栈中,是默认属性;

2.static变量存储在程序静态区中;

3.register变量存储在CPU寄存器中,且printf等函数不能读取存储器变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值