const与static归纳总结

来源:互联网 发布:金蝶erp软件二次开发 编辑:程序博客网 时间:2024/05/14 05:59

static与const都是C语言中的关键字,他们都可以修饰变量,函数等。

1.const

  const与 变量

    int  x = 5; // 变量

   const int  x = 5;//在c++中,x是常量,在c语言中,x是不可改变的变量 

  const与指针类型

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int a = 10;  
  2. int b = 20;  
  3. int *pa = &a;  
  4. int **ppa = &pa;  
  5. *ppa = &b;  
  6. **ppa = 30;  

我们用图来表示各种指向关系。


注:图中给出的地址是假设的,并非真实地址。~~

(一)const与一级指针

         eg:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int a= 10;  
  2. int const *pa = &a;  
  3. *pa = 30;  
第2句语句是说,pa指向的内容是不可改变,第3句语句改变了pa指向的内容,所以,以上代码不正确。

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int *const pa = &a;  
  2. pa = &b;  
const 修饰pa,所以,pa的内容不可改变,就是里边只能存a的地址,语句3改变了pa的内容,所以以上代码不对。
(二)const与二级指针

eg:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int *pa = &a;  
  2. int **const  ppa = &pa;  
  3. *ppa = &b;  
  4. **ppa = 30;   
ppa不能改变,里边只能存放pa的地址。语句3,ppa指向b的地址,语句4是将ppa指向的b的地址的内容改为30,。并未改变ppa,所以以上程序正确。
eg:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int *const * ppa = &pa;  
  2. *ppa = &b;  
ppa的指向即*ppa不可改变,第2语句改变ppa的指向,错误。
eg:
[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int const  ** ppa = &pa;  
  2. **pa = 30;  
ppa的指向的指向不可改变,错误。

  const 与引用

    int x = 3;

   const  int  &y = x;

   y = 5;//错误

2.static

     (1)static修饰函数:这个函数只能在当前的.c文件可见,这样就可以在不同的.c文件中定义同名函数,而不引起冲突,只要其中一个函数用static修饰;

     (2)static修饰局部变量:static变量定义在一个函数内,只有这个函数可以读取它,它的值在程序执行时一直保持;

     (3)static修饰全局变量:ststic变量定义在一个文件中,只有这个文件可以读取它。

  下边我们来看一道例题:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #define _CRT_SECURE_NO_WARNINGS 1  
  2. #include<stdio.h>  
  3. void fun1()  
  4. {  
  5.     int i = 0;  
  6.     for (i = 0;i < 10;i++)  
  7.     {  
  8.         static int m = 0;  
  9.         m++;  
  10.         printf("%d ",m);  
  11.     }  
  12.     printf("\n");  
  13. }  
  14. void fun2()  
  15. {  
  16.     int i = 0;  
  17.     for (i = 0;i < 10;i++)  
  18.     {  
  19.         int m = 0;  
  20.         m++;  
  21.         printf("%d ",m);  
  22.     }  
  23. }  
  24. int main()  
  25. {  
  26.     fun1();  
  27.     fun2();  
  28.     system("pause");  
  29.     return 0;  
  30. }  


程序运行结果是这样。两个函数看似差不多,也就是fun2的m是int 型,fun1的m被限定成静态的。static修饰局部变量时,他的值在程序执行过程中一直保持。
0 0