### const修饰普通变量
~~~
// const int num1 = 100;
// num1 = 200;
//
// printf("%d\n", num1); //报错,因为常量是不可修改的
const int num2 = 100;
int *p = &num2; //可以通过指针修改常量的值
*p = 300;
printf("%d\n", num2);
~~~
```
300
```
### const修饰指针类型
如果const修饰int * 类型 不能改变指针变量指向的内存地址的值,但是可以改变指针指向的地址.
~~~
int num1 = 10;
int num2 = 20;
const int *p;
p = &num1;
//*p = 100; //不可以
p = &num2; //可以
printf("%d\n", *p);
~~~
```
20
```
### const修饰指针变量
const修饰指针变量,能改变指针变量指向地址的值,但是不能改变指针指向的地址.
~~~
int num1 = 10;
int num2 = 20;
int *const p = &num1;
//p = &num2; //不可以
*p = 100; //可以
printf("%d\n", *p);
~~~
```
100
```
### const修饰类型和值
以下方式可以通过二级指针来修改.
~~~
int num1 = 10;
int num2 = 20;
const int *const p = &num1;
p = &num2; //不可以
*p = 100; //不可以
printf("%d\n", *p);
~~~
### 这样记
```
const int p; // p 为常量,初始化后不可更改
const int* p; // *p 为常量,不能通过*p改变它指向的内容
int const* p; // *p 为常量,同上
int* const p; // p 为常量,初始化后不能再指向其它内容
```
