您的位置:首页 > 编程语言 > C语言/C++

关于C语言中存储类别、链接的总结

2018-03-16 17:47 183 查看

作用域

作用域描述程序中可访问标识符的区域,一个C变量的作用域有块作用域、函数作用域、函数原型作用域或文件作用域。m定义在块中,具有块作用域,n为函数形参,具有函数原型作用域,范围从形参定义处到原型声明结束。这意味着编译器在处理函数原型中的形参时只关心他的类型,而形参名通常无关紧要。变量定义在函数外面(units)具有文件作用域,从他的定义处到定义所在的文件末尾均可见。
int block(int n)
{
int m;
……
}
int units=0;
int main()
{
}

链接

C变量有三种链接属性:外部链接,内部链接或无链接具有块作用域、函数原型作用域、函数作用域的变量都是无链接变量,这些变量只属于定义他们的块,函数或原型私有。具有文件作用域的变量可以是外部链接或内部链接,外部链接变量可以在多文件程序中使用,内部链接变量只能在一个翻译单元中使用。外部链接的文件作用域一般简称为“全局作用域”
int a=0;
static int b=0;
int main()
{
……
}
b使用了static标识符,即为内部链接,a为外部链接

存储期

C对象有四种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期。文件作用域变量具有静态存储期,在程序执行期间一直存在。线程存储期用于并发程序设计,从被声明到线程结束一直存在。块作用域具有自动存储期,进入块分配内存,退出块时释放内存,变长数组稍有不同,存储期从声明处开始,而不是从块开始处但是若在块中使用static int a形式,此变量将成为静态存储期,但是依然属于块作用域(即只有在块中才能使用a访问该对象),但是该函数可以给其他函数提供该存储区的地址以便间接访问该对象,例如通过指针形参或返回值静态变量和外部变量在程序被载入内存时已执行完毕外部链接的静态变量如果一个源代码文件使用的外部变量定义在另一个源代码文件中,必须用extern声明,但不要用extern定义一个变量存储类别说明符auto说明符表明变量为自动存储期(当变量同名时表明意图)register说明符把变量归为寄存器存储类别,并且保护地址不被访问(只适用于块作用域)static说明符表明变量具有静态存储期extern说明符表明声明的变量定义在别处好的程序可以不需要使用文件作用域变量!!!!!函数也有存储类别,当希望一个函数只在该文件中使用,用static声明。当使用全局变量且不希望被修改时,记得用CONST分配内存
double *ptd;
ptd=(double*)malloc(30*sizeof(double));
free(ptd);
malloc()返回动态分配内存的首字节地址,可以像使用数组名一样使用ptd,分配失败将返回空指针存储类别和动态内存分配程序把他可用的内存分为三部分,一部分供静态变量使用,一部分供自动变量使用,一部分供动态内存使用。自动变量的内存通常作为栈来处理,动态内存通常比栈内存慢。

限定符

restrict

只能用于指针,表明该指针是访问数据对象的唯一且初始的方式。volatile代理可以改变该变量的值,通常被用于硬件地址以及在其他程序或同时运行的线程中共享数据。_Atomic当一个线程对一个原子类型的对象执行原子操作时,其他线程不能访问该对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: