[关闭]
@SuHongjun 2020-04-26T23:58:18.000000Z 字数 1492 阅读 203

C语言-Day 16 变量存储类别、带参数的宏

C语言 2020春季学期


变量的存储类别:

auto:   变量存放于内存中的动态存储区
static: 变量存放于内存中的静态存储区
register: 变量存放于CPU中的寄存器

extern外部变量声明:

外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
还有一种情况是声明的变量定义于其他.c文件中。

全局变量是存储在静态存储区
auto型的局部变量是存储在动态存储区
static型的局部变量是存储在静态存储区

  1. #include "stdio.h"
  2. extern int x; //变量声明
  3. static int y=5; //变量定义,//静态存储区
  4. int z; //变量定义,//静态存储区
  5. main()
  6. {
  7. int i; //变量定义 ,//动态存储区
  8. auto int a; //动态存储区
  9. static int c; //静态存储区
  10. register int d; //存储在CPU内的寄存器里
  11. i = 5;
  12. a = 5;
  13. c = 5;
  14. d = 5;
  15. x = 5; //如果没有后面的int x的变量定义,这里会报错,因为extern 只是变量声明,而不是变量定义
  16. y = 5;
  17. }
  18. int x; //变量定义
  1. #include "stdio.h"
  2. main()
  3. {
  4. x = 5; //出错,因为变量x的有效作用范围在这里还没有开始
  5. }
  6. int x;
  1. #include "stdio.h"
  2. extern int x; //变量声明
  3. main()
  4. {
  5. x = 5; //加了变量声明后,这里不再出错
  6. }
  7. int x;
  1. #include "stdio.h"
  2. int y;
  3. extern int x;
  4. main()
  5. {
  6. auto int a; //相当于 int a;
  7. static int b;
  8. register int c;
  9. a = 5;
  10. b = 5;
  11. c = 5;
  12. y = 5;
  13. x = 5;
  14. }
  15. int x;

静态的局部变量与动态的局部变量之间的区别,请看下面的例子:

  1. #include "stdio.h"
  2. int f1()
  3. {
  4. int x=0; //动态的局部变量
  5. x++;
  6. return x;
  7. }
  8. int f2()
  9. {
  10. static int x=0; //静态的局部变量
  11. x++;
  12. return x;
  13. }
  14. main()
  15. {
  16. int i;
  17. for(i=0; i<10; i++)
  18. printf("i:%d\tf1():%d\tf2():%d\n", i,f1(),f2());
  19. }

输出:
i:0 f1():1 f2():1
i:1 f1():1 f2():2
i:2 f1():1 f2():3
i:3 f1():1 f2():4
i:4 f1():1 f2():5
i:5 f1():1 f2():6
i:6 f1():1 f2():7
i:7 f1():1 f2():8
i:8 f1():1 f2():9
i:9 f1():1 f2():10

带参数的宏

  1. #include "stdio.h"
  2. #define N(x) 30*x + x //宏名和小括号之间,不能有空格
  3. #define N2(x,y) x+y*x+y //宏名和小括号之间,不能有空格
  4. main()
  5. {
  6. printf("%d\n", N(4));//相当于 printf("%d\n", 30*4 + 4);
  7. printf("%d\n", N2(4,3));
  8. }

宏名和小括号之间,不能有空格

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注