C 语言 储存类型

声明说明符分为三类
存储类型 auto 、static 、 extern 、 register
如果要加存储类型,必须将存储类型放在声明的最前面。而且声明中只能出现一种存储类型。

类型限定符 const 、 volatile 、 restrict
类型说明符 void 、char 、int 、long、unsigned、signed、float、double 类型说明符可以组合使用。这些单词出现的顺序并不重要。
结构体、联合和枚举的说明是类型说明符 。 typedef 创建的类型名也是类型说明符。
函数说明符 inline

类型限定符和类型说明符必须跟在存储类型后边,但两者的顺序没有限制。但可能有不同的意义。不能盲目使用。
如 const int *p p 指向的地址的值不能改变,但可以改变地址。
int const *p 不能改变p 指向的地址,但地址类的值可以改变。

存储类型

存储期限:变量的存储期限决定了为变量预留和内存被释放的时间。
自动存储期限的变量所属块被执行时获得存储单元,并在块结束时释放内存单元。从而导致变量失去值。
具有静态存储期限的变量在程序运行期间占有同一个储存单元。在程序结束时吗,内存单元才被释放。
作用域:变量的作用域是指可以引用变量的那部分文本。变量具有块作用域和文件作用域。
块作用域:从变量声明的地方开始到块结束的位置。
文件作用域:
链接:变量的链接确定了程序的不同部分可以共享此变量的范围。具有外部链接的变量可以被程序中的几个或者全部的文件共享。具有内部链接的变量只能在所属文件内使用。但是文件内部的函数可以共享此变量。无链接的变量属于一个单独的函数。不能被共享。

auto 存储类型
auto 类型只对属于块的变量有效。auto 变量具有自动存储期限,块作用域,并且无链接,在块作用域中,它的类型是默认的,不需要特殊指出。

static 存储类型
static 存储类型可以用在全部类型的变量,所以不需要考虑变量声明的位置。但是作用在块外部声明变量和块内部声明变量意义是不一样的。
在块内部使用,将默认的存储类型auto 更改为static 。从自动存储期限更改为静态的。不会随着块的结束,结束变量的生成周期。但是变量仍然只能在该作用域内使用。作用域结束后,便无法访问此变量,只能在该作用域下次生成时,使用该变量。 在块内使用时,只有第一次使用会进行初始化。
在块外部使用时,会将变量默认的外部链接更改为内部链接。别的文件无法访问此变量。

extern存储类型
extern 存储类型可以使几个源文件共享同一个变量。
extern int a; 声明变量时,编译器会在其他文件里搜索变量a 的定义。如果没有找到定义,会导致编译失败。此时声明并不会分配内存。只是声明其他地方有这么一个变量,可以使用。声明语句可以使用多次,但定义只能有一次。不然会引起冲突。编译失败。
extern 声明中的变量始终具有静态存储期限。在其他文件中使用该变量时需要先在文件中声明。不然会导致链接错误。当在块内声明时,作用域是在块内,无链接。 当在块外部声明时,作用域为整个文件。链接为内部链接。

//file1
#include <iostream>
int b = 90;  // b默认为extern 类型。
//file2
#include <iostream>

extern int b;     //b 为在file1文件中定义的变量  当没有此语句时,show()函数无法找到变量b 的定义。

void showdata()
{
     extern int b;   //在块内声明,只能在此块内使用。
    std::cout << b  << std::endl;
     b = 7;         //b 的存储类型为静态类型。在块结束后,变量b的值为7。
    std::cout << b  << std::endl;
}
void show()
{
    std::cout << b << std::endl;
}
int main()
{
    show();  // 输出70
    showdata();  // 输出 70   7
    show();    //  输出 7
    return 0;
}

register 存储类型
声明变量具有register 存储类型,要求编译器将变量储存在寄存器中。而不是像其他的变量一样保存在内存中。但这只是请求,不是命令。编译器可以选择把register型变量存储在内存中。
register 存储类型只对声明在块内的变量有效。具有和auto存储变量一样的存储期限、作用域和链接。但是由于寄存器没有地址,所以对register 类型变量取地址是非法的。即使编译器将register 类型变量存储在内存中。
register 类型变量最好用于频繁进行访问或者更新的变量。
现在许多的编译器可以自动确定可以将哪些变量保存在寄存器中。

函数的存储类型

和变量名声明一样,函数声明和定义也可以包含存储类型。选项有extern 和static 。
extern int function(void); 表明函数具有外部链接。可以在其他文件中调用此函数。且函数默认为extern 存储类型。具有外部链接 。所以可以不加extern 。

static int function(void);
函数具有内部链接。其他文件无法调用。不过可以通过函数指针间接调用。
使用static 存储类型可以使程序更容易维护。减少名称空间的污染。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值