目录
1. const 关键字
- const 是 constant 的缩写,意思是“恒定不变的”!
- 定义只读变量的关键字,定义的变量的值不允许改变,即使是赋相同的值也不可以
- 用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程,使变量具有静态特性,但不是静态变量
- 局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段”中,只读数据段中存放着常量和只读变量等不可修改的量
- const是普通变量的定义,具有变量的基本属性,有类型、占用存储单元,有数据类型,有类型安全检查
对于比较普通的变量,const有两种定义方法:
const int a = 10;
// 或
int const a = 10;
但是对于指针变量,const在不同位置代表意义不同:
- const在 * 前面,就表示cosnt作用于p所指向的是一个常量,可以改变指针变量(地址),不可以改变指针指向的值
- const在 * 的后面,表示p本身是一个常量,故不可以改变指针变量(地址)
- 但是如果p指向的是常量(如const int *const p5 = &a;)此时针变量(地址)、指针所指的值都不可修改
#include <stdio.h>
int main(void)
{
int a = 6;
int b = 9;
int *p1 = &a; //*p1得到的是6
// *p1 = 9; //正确,*p1得到的值是9
// p1 = &b; //正确,*p1得到的值是9
// 结论:可以修改指针的值(地址),也可以修改指针所指向的值
const int *p2 = &a; //*p2得到的值为6
// *p2 = 9; //报错,assignment of read-only location ‘*p2’
// p2 = &b; //正确,*p2得到的值是9
// 结论:可以修改指针的值(地址),不可以修改指针所指向的值
int const *p3 = &a; //*p3得到的值为6
// *p3 = 9; //报错,assignment of read-only location ‘*p3’
// p3 = &b; //正确,*p3得到的值是9
// 结论:可以修改指针的值(地址),不可以修改指针所指向的值
int *const p4 = &a; //*p4得到的值为6
// *p4 = 9; //正确,*p4得到的值是9
// p4 = &b; //报错,assignment of read-only variable ‘p4’
// 结论:不可以修改指针的值(地址),可以修改指针所指向的值
const int *const p5 = &a; //*p5得到的值为6
// *p5 = 9; //报错,assignment of read-only location ‘*p5’
// p5 = &b; //报错,assignment of read-only variable ‘p5’
// 结论:既不能修改指针的值(地址),也不能修改指针所指向的值
printf("p = %d \n",*p5);
return