const及static简单剖析

1.const 修饰指针:
int m = 0;
int n = 0;
const int *p = &m;
*p = 20;   //no
p = &n;    //ok
  当const放在 * 的左边,表示指针所指向的内容是不能通过指针来改变,但是指针本身可以改变。
int m = 0;
int n = 0;
int * const p = &m;
*p = 20;   //ok
p = &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;
}
修饰变量(局部/全局):
  局部变量——改变的是存储类型(自由—>静态),同时影响生命周期,但不改变作用域
  全局变量——改变的是链接属性(外部链接属性—>内部链接属性)
修饰函数:
  改变的是链接属性(外部链接属性—>内部链接属性)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值