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

[复制链接]
989|9
 楼主| niuyaliang 发表于 2015-3-17 20:25 | 显示全部楼层 |阅读模式
一、全局变量和局部变量

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


 楼主| niuyaliang 发表于 2015-3-17 20:25 | 显示全部楼层
注意:一般而言,全局变量总是在所有函数之前定义,但如果某全局变量定义在两个函数之间,则定义处后面的函数可以使用,而其前面函数不能使用。
 楼主| niuyaliang 发表于 2015-3-17 20:26 | 显示全部楼层

  1. #include <stdio.h>

  2. void subFunc();

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

  4. int main(void)
  5. {
  6.     int num = 250;    //局部变量

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

  12.     subFunc();

  13.     return 0;
  14. }

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

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

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

  25.     return ;
  26. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 20:26 | 显示全部楼层
二、静态变量
有人说静态变量相当于全局变量,这句话其实不对。全局变量变成静态,就失去了静态的意义,因此,静态一般是加在局部变量上的。那么,究竟什么是静态的局部变量呢?静态变量随函数的定义而定义,如果已经存在就延用,但并不随函数的结束而消亡。在某一函数中定义的静态局部变量,不能在其它函数使用。
 楼主| niuyaliang 发表于 2015-3-17 20:27 | 显示全部楼层

  1. #include <stdio.h>

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

  3. int main(void)
  4. {
  5.     subFunc();
  6.     subFunc();
  7.     subFunc();

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

  10.     return 0;
  11. }

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

  16.     m++, n++;

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

  18.     return ;
  19. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 20:27 | 显示全部楼层
三、外部变量
当很多人编写同一程序时,一般程序会被分割成几个文件。当几个人都定义了某一全局变量时,编译时不出错,Link时将出错。解决这个问题的办法:将其中一个定义原封不动,其余的定义前加上extend(即外部的定义)。
 楼主| niuyaliang 发表于 2015-3-17 20:27 | 显示全部楼层
刚才所说是许多书上说的,小雅做了n次试验,证明上述编译时也不错,Link时也不错,也就是说extend完全是多余的。大概上面所说是几十年前的版本吧。事实上与extend同列在一起的还有auto、regist等变量修饰符。auto是区别B语言的,早就没用了,regist是将变量放到寄存器来运算,小雅认为基本没有这种需要。
 楼主| niuyaliang 发表于 2015-3-17 20:29 | 显示全部楼层

  1. /*******************
  2. *     test1.c     *
  3. *******************/
  4. #include <stdio.h>

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

  7. int main(void)
  8. {
  9.     int i;

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

  12.     for (i=0; i<count; i++) {
  13.         printf("%2d ", i);
  14.         if (i % 10 == 9) {
  15.             printf("\n");
  16.         }
  17.     }
  18.     printf("\n");

  19.     return 0;
  20. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| niuyaliang 发表于 2015-3-17 20:29 | 显示全部楼层
  1. /*******************
  2. *     test2.c     *
  3. *******************/
  4. #include <stdlib.h>

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

  9.     return ;
  10. }
 楼主| niuyaliang 发表于 2015-3-17 20:29 | 显示全部楼层
拆成多个文件,多次定义全局变量时要注意:
变量的数据类型要一致。
有长度的数组和没定义长度的数组可以视为同一数据类型。
数组和指针不能视为同一数据类型。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部