C存储类、链接小结

参考《C Primmer Plus》

首先唠唠C语言关键字:

数据类型14个:

           void,  char(1字节),  int(4字节), short(2字节),  long(4字节),  signed(4字节), unsigned(4字节),

           float(4字节),  double(8字节),  struct, union, enum, typedef, sizeof

存储类控制类型6个:

           auto, static, extern, register, const, volatile

流程控制12个

           if, else, for, do, while, switch, case, default, return, contiue, break, goto

再看看C语言内存分配形式:

①BSS段:存储未初始化的全局数据和静态数据(静态存储区)

②数据段:存储已初始化的全局变量(静态存储区)

③代码段/文本段/代码区:存储类成员函数、全局函数和其他函数

④栈区:存放调用函数相关的变量和地址、被调用函数临时创建的局部变量(不包括static声明的变量)--函数被调用时,参数也会被压入发起调用进程栈中,

           调用结束后,函数返回值也会被存放回栈中

⑤堆区:存储动态分配的变量

  

C为变量提供了5种不同的存储模型,或称为存储类。 见下表:


存储类


存储时期


作用域


链接


声明方式和位置

自动 自动 代码块 空链接 代码块内
寄存器 自动 代码块 空链接 代码块内,使用关键字register
具有外部链接的静态 静态 文件作用域 外部链接 所有函数之外
具有内部链接的静态 静态 文件作用域 内部链接 所有函数之外,使用关键字static
空链接的静态 静态 代码块 空链接 代码块内,使用关键字static

 

存储类可以通过一个变量的作用域、链接和存储时期描述之。

1.作用域

     作用域用于描述一个标识符可以被访问(可见)的一个或多个区域。一个C变量的作用域可以是代码块作用域、函数原型作用域(函数原型为函数的声明,即不包含函数体)、或者文件作用域。  其中代码块是包含在开始花括号和对应的结束花括号之内的一段代码。在所有函数之外定义的变量具有文件作用域,具有文件作用域的变量从定义的位置到该文件结尾都可见。

2.链接

    一个C变量具有下列链接之一:外部链接、内部链接、或空链接。

    具有代码块作用域或者函数原型作用域的变量有空链接,即该变量由该代码块或函数原型所私有的。  具有文件作用域的变量,如果使用使用了存储类型说明符static,则为内部链接,否则为外部链接。内部链接变量可以在该文件任何地方使用,而在文件之外不可见,因此不会与其他文件同名变量发生冲突(若同名,链接时候会报重定义错误);外部链接变量可以在该文件和别的文件中(用extern进行声明)使用。

3.存储时期

     一个C变量有2中存储时期:静态存储时期和自动存储时期。

具有文件作用域的变量,关键字static表明链接类型,并非存储时期,所有文件作用域变量都具有静态存储时期。静态指的是变量的位置固定不动。                                     

 

具有外部链接的静态变量:

     把变量的定义和声明放在所有函数之外,即创建了一个外部变量。为了使程序更加清晰,可以在使用外部变量的函数中使用extern再次声明它,如果在函数内定义了一个与外部变量同名的局部变量,则该变量为一个独立的自动变量,即会覆盖同名的文件作用域变量。如果一个变量是在别的文件中定义的,使用extern来声明该变量就是必须的(extern表明是引用声明)

其中静态变量和外部变量一般在定义声明时候进行初始化,如果没有初始化,则会自动初始化为0

小例子:

//file1.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

int Coal = 1214;
int abc = 11;

//file2.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

int Errupt = 20;            /*  外部定义的变量 */
double Up[100];        /*  外部定义的数组 */

extern int Coal;
//int abc = 10;       /* 与file1.cpp重定义  */

void next(void)
{
    int Errupt = 10;

    printf("%d\n", Errupt);
}

int main()
{
    printf("%d\n", Coal);

    next();

    printf("%d\n", Errupt);

    extern int Errupt;         /*  可选的声明   */
    extern int Up[];           /*  可选的声明   */
    printf("%d\n", Errupt);

    return 0;
}

输出结果为:

1024

10

20

20

更多拓展http://blog.csdn.net/hackbuteer1/article/details/7487694

时间: 2024-12-08 23:33:41

C存储类、链接小结的相关文章

存储类、链接、内存管理

作用域:代码块作用域.函数原型作用域.文件作用域 函数作用域(只适用于goto) 链接:外部链接.内部链接.空链接(代码块作用域.函数原型作用域) 存储时期:静态存储时期.自动动态存储时期 五种存储类:自动,寄存器(代码块内使用register,不能使用地址运算符),外部链接的静态.内部链接的静态(static).空链接 x =30;while(x++<33){ int x = 100; printf("%d",x); } 打印了三次100,递增必须在条件判断语句中 对函数参量不

C Primer Plus之存储类、链接和内存管理

存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域    作用域描述了程序中可以访问一个标识符的一个或多个区域.一个C变量的作用域可以是代码块作用域.函数原型作用域,或者文件作用域. 在代码块中定义的变量具有代码块作用域,从该变量被定义的地方到包含该定义的代码块的末尾该变量均可见.其次,函数的形式参量尽管在函数的开始花括号前进行定义,同样也具有代码块作用域,隶属于包含函数体的代码块.

CPrimer Plus第12章 存储类、链接和内存管理随笔

被static修饰的属于内部链接,不可被外部程序文件所使用一般而言,全局变量(文件作用域变量)具有静态存储期,局部变量(代码块作用域变量)具有自动存储期寄存器变量不能使用地址运算符因为被static修饰的变量不会中途被释放,所以不能用static修饰函数的形参变量的定义放在所有函数定义的外部即创建了一个外部变量,若外部变量在其他文件中定义,则需见extern修饰全局变量只能用常量表达式来赋值:int i;    int j = 2*i;不被允许 ptd = (double *)malloc(n

C语言--存储类、链接和内存管理

注:此文为<C Primer Plus>一书中的部分总结,写下来方便以后参考. 用于存储程序数据的内存可用存储时期.作用域和链接来表征. 存储时期可以使静态的.自动的或者分配的.①如果是静态的,内存在程序开始执行时被分配,并行程序运行时一直存在.②如果是自动的,变量所用内存在程序执行到该变量定义所在代码块时开始分配,在退出代码块时释放.③如果是分配的内存,内存通过调用malloc()(或其他相关函数)分配,通过调用函数free()释放. 作用域决定哪一部分程序可以访问某个数据.在所有函数之外定

存储类、作用域、生命周期、链接属性

1.linux下C语言程序的内存映像代码段(.text).数据段(.data).bss段.栈.堆的概念 代码段(.text) (1)对应着程序中的代码(函数),代码段在linux中又叫文本段(.text)(2)部分平台下的const修饰的变量. 数据段(.data) 1.显式初始化为非0的全局变量: 2.显式初始化为非0的static局部变量 bss段 1.显式初始化为0或者未显式初始化的全局变量: 2.显式初始化为0或未显式初始化的static局部变量. 栈 局部变量分配在栈上:函数调用传参过

4.7 C语言的存储类,作用域,生命周期,链接属性

C语言背后的运行机制,学会了会对C语言更加熟悉,可以直接看到C语言的骨头里去. 存储类(storage class): ①什么是存储类? 存储类就是变量存储类型,即变量在内存中存储在什么段. 例如:栈:普通局部变量. 数据段(.data):初始化不为零的全局变量,静态局部变量. bss段:初始化为零 或 未初始化的全局变量. (其实bss段就是初始化为0的数据段)   代码段(.text):存放程序执行代码的一块内存区域. ②存储类相关的关键字? auto static register ext

【CPP.Chap12】存储类、链接和内存管理——渣渣的艰苦学习

今晚看完这一章啦!为加入工作室奋战!!!=( ̄ˇ ̄)v C为变量提供了五种存储模型/存储类,对于一个变量,可以按照存储时期.作用域以及链接来描述它. 一.( σ'ω')σ关于作用域.链接.存储时期: 作用域(scope):分为①代码块作用域(block scope)②函数原型作用域 (function prototype scope)③文件作用域(file scope):指在所有函数之外定义的变量④*函数作用域(function scope):只适用于goto语句,暂不涉及. 链接(linkag

存储类、链接和内存管理

关键字: auto.extern.static.register.const.volatile.restricted. 函数: rand().srand().time().malloc().calloc().free(). 不同的存储类提供了变量的作用域(scope).链接(linkage)以及存储时期(storage duration)的不同组合 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量 作用域:一个C变量的作用域可以是代码块作用域.函数原型作用域.或者文件作用域.

C Primer Plus (第五版) 第十二章 存储类、链接和内存管理 编程练习

第十二章 存储类.链接和内存管理 编程练习 1.Q不使用全局变量,重写程序清单13.4 #include <stdio.h>; int critic(int u); int main(void) { int units; printf("How many pounds to a firkin of butter?\n"); scanf_s("%d", &units); while (units != 56) critic(units); prin