C/C++ 中堆和栈及静态数据区详解

2020-01-06 17:17:33王振洲

   2.全局作用域

  对于具有全局作用域的变量,我们可以在程序的任何位置访问它们。当一个变量是在所有函数的外部声明,也就是在程序的开头声明,那么这个变量就是全局变量。


 void add(int);
   int num;

   main()
   {
    int n=5;
    add(n);
    printf("%dn",num);  /*输出6*/
   }

   void add(num)   /*形式参数没有指定类型*/
   {
    num++;
    printf("%dn",num);  /*输出6*/
   }

      上面的main()和add()里面,并没有声明num,但是在最后输出的时候却要求输出num,这是由于在程序的开始声明了num是全局变量,也就是在 所有函数里都可以使用这个变量。这时候一个函数里改变了变量的值,其他函数里的值也会出现影响。上面的例子输出都是6,因为在add()函数里改变了 num的值,由于num是全局变量,就好象它们两个函数共用一个变量,所以在main()函数里的num也随之改变了。

    3.文件作用域

  在很多C语言书上,都没有说明文件作用域,或者只是略微的提到,其实文件作用域在较大程序中很有作用(在多文件系统中)。文件作用域是指外部标识符仅在声 明它的同一个转换单元内的函数汇总可见。所谓转换单元是指定义这些变量和函数的源代码文件(包括任何通过#i nclude指令包含的源代码文件)。static存储类型修饰符指定了变量具有文件作用域。


   static int num;
   static void add(int);

   main()
   {
    scanf("%d",&num);
    add(num)
    printf("%dn",num);
   }

   void add(num)
   {
    num++;
   }

     上面的程序中变量num和函数add()在声明是采用了static存储类型修饰符,这使得它们具有文件作用域,仅爱定义它们的文件内可见。

     由于我们提到的大多数程序都只有一个编译文件组成,所以这种写法没有实际意义。但是实际工程上的文件有很多,它们不是由一个人写成的,由很多人共同完成, 这些文件都是各自编译的,这难免使得某些人使用了一样的全局变量名,那么为了以后程序中各自的变量和函数不互相干扰,就可以使用static修饰符,这样 在连接到同一个程序的其他代码文件而言就是不可见的。

  二、变量存储类型

  前面我们说了,声明变量时用如下类似的形式:

int num;
float total; 

   它们都没有存储类型修饰符,我们在声明时也可以通过存储类型修饰符来告诉编译器将要处理什么类型的变量。存储类型有以下四种:自动(auto)、静态(static)、外部(extern)、寄存器(regiser)。

      1.自动存储类型