const及static简单剖析

来源:互联网 发布:步进电机驱动器编程 编辑:程序博客网 时间:2024/06/05 16:35

1.const 修饰指针:

int m = 0;int n = 0;const int *p = &m;*p = 20;   //nop = &n;    //ok

  当const放在 * 的左边,表示指针所指向的内容是不能通过指针来改变,但是指针本身可以改变。

int m = 0;int n = 0;int * const p = &m;*p = 20;   //okp = &n;    //no

  当const放在 * 的右边,表示指针所指向的内容是可以通过指针来改变,但是指针本身不可以改变。

#include <stdio.h>int main(){    const int num = 10;    int *p = (int *)&num;    *p = 20;    printf("%d\n", num);    system("pause");    return 0;}

  此代码若在VS中会输出20,但在C++编译器中编译会输出10而不是20;原因是编译器在编译期间可能对代码进行优化。

  当编译器看到num被const修饰,从语义上讲这里的num是不期望被改变的,那么优化的时候就可以把num的值存放到寄存器(以提高访问的效率)中。以后只要使用num的地方都要去寄存器中取,那么即使num对应的内存中的值发生改变,寄存器也感知不到,所以造成输出结果为10。若想输出为20,可在const前加上volatile,增加可见性。


2.static作用:

#include <stdio.h>static int m;void fun1(){    static int n = 0;    n++;    printf("%d ", n);}void fun2(){    int m = 0;    m++;    printf("%d ", m);}int main(){    int i = 0;    for (i = 0; i < 10; i++)    {        fun1();          //结果为1 2 3 4 5 6 7 8 9 10    }    printf("\n");    for (i = 0; i < 10; i++)    {        fun2();          //结果为全1    }    printf("\n");    system("pause");    return 0;}

修饰变量(局部/全局):

  局部变量——改变的是存储类型(自由—>静态),同时影响生命周期,但不改变作用域

  全局变量——改变的是链接属性(外部链接属性—>内部链接属性)

修饰函数:

  改变的是链接属性(外部链接属性—>内部链接属性)

原创粉丝点击