1.const 修饰指针:
int m = 0;
int n = 0;
const int *p = &m;
*p = 20;
p = &n;
当const放在 * 的左边,表示指针所指向的内容是不能通过指针来改变,但是指针本身可以改变。
int m = 0;
int n = 0;
int * const p = &m;
*p = 20;
p = &n;
当const放在 * 的右边,表示指针所指向的内容是可以通过指针来改变,但是指针本身不可以改变。
int main()
{
const int num = 10;
int *p = (int *)#
*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();
}
printf("\n");
for (i = 0; i < 10; i++)
{
fun2();
}
printf("\n");
system("pause");
return 0;
}
修饰变量(局部/全局):
局部变量——改变的是存储类型(自由—>静态),同时影响生命周期,但不改变作用域
全局变量——改变的是链接属性(外部链接属性—>内部链接属性)
修饰函数:
改变的是链接属性(外部链接属性—>内部链接属性)