1) int * const p; 指針常量:p 是 int*類型,那么const修飾的是p,所以p是常量,表示p指向的地址不可修改, 也就是說,p不能再指向別的地方了,但是可以修改p指向的這個(gè)地址里的值。 舉例: int a = 10; int b = 20; int * const p = &a; p = &b;// 錯(cuò)誤 *p = 100;// 允許
2) const int *p; int const *p; 常量指針:p 是 int*類型,那么const修飾的是*p,所以*p是常量,表示p指向的地址里的值不可修改, 也就是說,p里的值不能再重新賦值了,但是可以修改p指向的地址。 int a = 10; int b = 20; const int *p = &a; p = &b;// 可以 *p = 100;// 錯(cuò)誤
3) const int * const p; 常量指針常量:p 是 int*類型,那么const分別修飾了p 和 *p, 所以p和*p都是常量,表示p指向的地址不可修改, 同時(shí)p指向的地址里的值也不可修改。 int a = 10; int b = 20; const int *const p = &a; p = &b;// 錯(cuò)誤 *p = 100; // 錯(cuò)誤
《C Primer Plus》 : "自由的代價(jià),是永遠(yuǎn)的警惕。" 你定義了一個(gè)指針,那就一定要知道這個(gè)指針指向的什么地方,而且你要保證這個(gè)指針是真實(shí)有效的,否則我就用程序崩潰來懲罰你。
四、多級(jí)指針
#include <stdio.h> int main(void) { int a = 10; int *p = &a;// 定義一個(gè)一級(jí)指針變量,存儲(chǔ)了整型變量a的地址 int **pp = &p;// 定義一個(gè)二級(jí)指針變量,存儲(chǔ)了整型一級(jí)指針變量p的地址 int ***ppp = &pp;// 定義了一個(gè)三級(jí)指針變量,存儲(chǔ)了整型二級(jí)指針變量pp的地址