### 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 為常量,初始化后不能再指向其它內容
```