const----修饰变量
标准C对常量的处理:const(修饰的)不是真的常量,他只是告诉编译器这是个只读的变量,即在:程序里不能直接将他作为左值(不能直接对一个const修饰的变量直接赋值)。但是本质还是变量,仍然会占用内存空间。
我们可以通过取地址操作符来得到他的地址,通过地址改变他内存里的值。const只对编译器有用,在运行时无用。
int main(){
const int a=1;
int *p = (int*)&a;//作为右值,取地址访问。在程序运行的时候,此时会到内存里面,找到a这块内存地址,让p指向这块地址。int *定义指针p
//只要出现一次&,就按这种方式,到内存里去取值,对吗?
printf("%d",a);//到内存里去取a的值,没被改,还是1
*p = 3;//通过指针,更改了a的值
printf("%d",a);
return 0;
}
result: 1, 3
const----修饰数组----修饰的数组是只读的(不能出现在赋值符号的左边)
const修饰的数组空间不可被改变----不是绝对的,有些编译器可以通过指针改变(编译器做的不规范)----记住不可以改变
const----修饰指针
口诀:左数右指
当const出现在*左侧的时候,指针指向的数据为常量
当const出现在*右侧的时候,指针本身为常量
指针补充:
int a = 3; // 声明一个整数变量 a,并初始化为值 3
int *p; // 声明一个整型指针 p
p = &a; // 将变量 a 的地址赋值给指针 p
*p = a; // 通过指针 p 修改变量 a 的值,*p是解指针
例子:
int main()
{
int i = 1;
const int* p = &i;//将变量 i 的地址赋值给了 p,使得 p 指向 i
*p = 3; //const限定了p 无法修改指向的整数的值;*p是解指针
printf("%d\n", i);
return 0;
}
int main()
{
int i = 1;
int const* p = &i; //与const int*没有区别
*p =3;
printf("%d\n", *p);
return 0;
}
int main()
{
int i = 1;
int* const p = &i;
*p =3;//指针指向的内容可以改变
p = NULL; //指针不可以改变
printf("%d\n", *p);
return 0;
}
int main()
{
int i = 1;
const int* const p = &i;
*p =3; //指针指向的内容不可以改变
p = NULL; //指针不可以改变
printf("%d\n", *p);
return 0;
}
const----修饰函数参数和返回值
- 修饰函数参数 表示在函数体内不希望改变参数的值
- 修饰函数返回值 表示函数返回值不可以被改变,多用于返回指针的情形
volatile----防止编译器自我为是的优化
-
volatile可理解为“编译器警告指示字”
-
volatile用于告诉编译器必须每次去内存中取变量值
-
volatile主要修饰可能被多个线程访问的变量
-
volatile也可以修饰可能被未知因数更改的变量