《C语言教程》15章 函数和变量的关系


一、全局变量和局部变量

在函数之外定义的变量是全局变量,在函数内定义的变量是这个函数的局部变量。局部就是只能在当前函数内使用,而全局变量可以在任何一个函数中使用。

注意:一般而言,全局变量总是在所有函数之前定义,但如果某全局变量定义在两个函数之间,则定义处后面的函数可以使用,而其前面函数不能使用。


#include <stdio.h>

void subFunc();

int gVar1 = 150;    //全局变量1

int main(void)
{
    int num = 250;    //局部变量

    printf("这是在main程序中:\n");
    printf("gVar1  = [%d]\n", gVar1);
    printf("num    = [%d]\n", num);
//  printf("gVar2  = [%s]\n", gVar2);
//  printf("buffer = [%s]\n", buffer);

    subFunc();

    return 0;
}

//这个就是只能在后面的subFun()中使用,不能用在main()中
char *gVar2 = "I am a global variable.";    //全局变量2

void subFunc()
{
    char *buffer = "I am in subFunc.";  //局部变量

    printf("\n这是在subFunc程序中:\n");
    printf("gVar1  = [%d]\n", gVar1);
//  printf("num    = [%d]\n", num);
    printf("gVar2  = [%s]\n", gVar2);
    printf("buffer = [%s]\n", buffer);

    return ;
}

二、静态变量

有人说静态变量相当于全局变量,这句话其实不对。全局变量变成静态,就失去了静态的意义,因此,静态一般是加在局部变量上的。那么,究竟什么是静态的局部变量呢?静态变量随函数的定义而定义,如果已经存在就延用,但并不随函数的结束而消亡。在某一函数中定义的静态局部变量,不能在其它函数使用。


#include <stdio.h>

char *getMemory(size_t);    //申明后面要用的函数

int main(void)
{
    subFunc();
    subFunc();
    subFunc();

    //静态局部变量仍是局部变量,在别的函数中不能使用。
    //printf("m = %d \n", m);

    return 0;
}

void subFunc()
{
    static int m = 0 ;  //静态的局部变量
    int n = 0 ;         //局部变量

    m++, n++;

    printf("m = %d ,  n = %d \n", m, n);

    return ;
}

三、外部变量

当很多人编写同一程序时,一般程序会被分割成几个文件。当几个人都定义了某一全局变量时,编译时不出错,Link时将出错。解决这个问题的办法:将其中一个定义原封不动,其余的定义前加上extend(即外部的定义)。

刚才所说是许多书上说的,小雅做了n次试验,证明上述编译时也不错,Link时也不错,也就是说extend完全是多余的。大概上面所说是几十年前的版本吧。事实上与extend同列在一起的还有auto、regist等变量修饰符。auto是区别B语言的,早就没用了,regist是将变量放到寄存器来运算,小雅认为基本没有这种需要。


/*******************
 *     test1.c     *
 *******************/
#include <stdio.h>

void subFunc();
int count;    //全局变量

int main(void)
{
    int i;

    subFunc();
    printf("%2d\n",count);

    for (i=0; i<count; i++) {
        printf("%2d ", i);
        if (i % 10 == 9) {
            printf("\n");
        }
    }
    printf("\n");

    return 0;
}
/*******************
 *     test2.c     *
 *******************/
#include <stdlib.h>

extern int count;    //全局变量  extern不要也正确
void subFunc()
{
    count = rand();

    return ;
}

拆成多个文件,多次定义全局变量时要注意:

  1. 变量的数据类型要一致。
  2. 有长度的数组和没定义长度的数组可以视为同一数据类型。
  3. 数组和指针不能视为同一数据类型。