当前位置:   article > 正文

static、#define 定义常量和宏、指针_#define static

#define static

目录

static

#define 定义常量和宏

指针


static

static是用来修饰变量和函数的

1. 修饰局部变量-称为静态局部变量

2. 修饰全局变量-称为静态全局变量

3. 修饰函为静态函数。

  1. //代码1
  2. #include <stdio.h>
  3. void test()
  4. {
  5. int i = 0;
  6. i++;
  7. printf("%d ", i);
  8. }
  9. int main()
  10. {
  11. int i = 0;
  12. for(i=0; i<10; i++)
  13. {
  14. test();
  15. }
  16. return 0;
  17. }
  18. //代码2
  19. #include <stdio.h>
  20. void test()
  21. {
  22. //static修饰局部变量
  23. static int i = 0;
  24. i++;
  25. printf("%d ", i);
  26. }
  27. int main()
  28. {
  29. int i = 0;
  30. for(i=0; i<10; i++)
  31. {
  32. test();
  33. }
  34. return 0;
  35. }
  36. /*对比代码1和代码2的效果理解static修饰局部变量的意义。
  37. 结论:
  38. static修饰局部变量改变了变量的生命周期
  39. 让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
  40. 11.2.2 修饰全局变量
  41. 代码1正常,代码2在编译的时候会出现连接性错误。
  42. 结论:
  43. 一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使
  44. 用。
  45. */


对比代码1和代码2的效果理解static修饰局部变量的意义。
结论:
static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
 static修饰全局变量

  1. //代码1
  2. //add.c
  3. int g_val = 2018;
  4. //test.c
  5. int main()
  6. {
  7. printf("%d\n", g_val);
  8. return 0;
  9. }
  10. //代码2
  11. //add.c
  12. static int g_val = 2018;
  13. //test.c
  14. int main()
  15. {
  16. printf("%d\n", g_val);
  17. return 0


代码1正常,代码2在编译的时候会出现连接性错误。
结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使
用。

 static修饰函数

  1. //代码1
  2. //add.c
  3. int Add(int x, int y)
  4. {
  5. return c+y;
  6. }
  7. //test.c
  8. int main()
  9. {
  10. printf("%d\n", Add(2, 3));
  11. return 0;
  12. }
  13. //代码2
  14. //add.c
  15. static int Add(int x, int y)
  16. {
  17. return c+y;
  18. }
  19. //test.c
  20. int main()
  21. {
  22. printf("%d\n", Add(2, 3));
  23. return 0;
  24. }


代码1正常,代码2在编译的时候会出现连接性错误.
结论:
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
剩余关键字后续课程中陆续会讲解。


#define 定义常量和宏

  1. //define定义标识符常量
  2. #define MAX 1000
  3. //define定义宏
  4. #define ADD(x, y) ((x)+(y))
  5. #include <stdio.h>
  6. int main()
  7. {
  8. int sum = ADD(2, 3);
  9. printf("sum = %d\n", sum);
  10. sum = 10*ADD(2, 3);
  11. printf("sum = %d\n", sum);
  12. return 0;
  13. }

指针

1 内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是 1 个字节
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该 内存单元的地
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出变量地址如下:
  1. #include <stdio.h>
  2. intmain(){
  3. intnum=10;
  4. &num;//取出num的地址
  5.    //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
  6. printf("%p\n", &num);//打印地址,%p是以地址的形式打印
  7. return0;
  8. }

那地址如何存储,需要定义指针变量。
int  num = 10 ;
int* p ; //p 为一个整形指针变量
p =& num ;
指针的使用实例:
#include <stdio.h>
int main ()
{
int  num = 10 ;
int* p =& num ;
* p = 20 ;
    return  0 ;
}
以整形指针举例,可以推广到其他类型,如:
#include <stdio.h>
int main ()
{
char  ch = 'w' ;
char* pc =& ch ;
* pc = 'q' ;
printf ( "%c\n" , ch );
    return  0 ;
}
指针变量的大小
#include <stdio.h>
// 指针变量的大小取决于地址的大小
//32 位平台下地址是 32 bit 位(即 4 个字节)
//64 位平台下地址是 64 bit 位(即 8 个字节)
int  main ()
{
    printf ( "%d\n" , sizeof ( char* ));
    printf ( "%d\n" , sizeof ( short* ));
    printf ( "%d\n" , sizeof ( int* ));
    printf ( "%d\n" , sizeof ( double* ));
    return 0 ;
}
结论 :指针大小在32 位平台是 4 个字节, 64 位平台是 8 个字节。
结构体:
结构体是 C 语言中特别重要的知识点,结构体使得 C 语言有能力描述复杂类型。
比如描述学生,学生包含: 名字 + 年龄 + 性别 + 学号 这几项信息。
这里只能使用结构体来描述了。
例如:
struct  Stu
{
    char  name [ 20 ]; // 名字
    int  age ;       // 年龄
    char  sex [ 5 ];   // 性别
    char  id [ 15 ] // 学号
};
结构体的初始化:
// 打印结构体信息
struct  Stu s = { " 张三 " 20 " " "20180101" };
//. 为结构成员访问操作符
printf ( "name = %s age = %d sex = %s id = %s\n" , s . name , s . age , s . sex , s . id );
//-> 操作符
struct  Stu  ps =& s ;
printf ( "name = %s age = %d sex = %s id = %s\n" , ps -> name , ps -> age , ps -> sex , ps -
> id );
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/264346
推荐阅读
相关标签
  

闽ICP备14008679号