該文爲中國大學MOOC上北京郵電大學崔毅東和楊談老師主講的《C++程序設計(面向對象進階)》筆記整理
1. const
常量是程序中一塊數據,這個數據一旦聲明後就不能被修改
代碼示例:
const datatype CONSTANTNAME = VALUE;
或
datatype const CONSTANTNAME = VALUE;
常量分爲命名常量和字面常量,如 const int A = 12; 其中 A 是這塊數據的名字,稱爲命名常量,其中 12 能從字面上就看出它的值,稱爲字面常量
2. 指針
指針是一個地址,類似 0x8FFF 這樣。而地址,就是某個內存位置的編號。該位置的地址可以存放數據,這些數據被稱爲"指針所指的數據"或"指針指向的數據"
代碼示例:
int* x; // 定義 int 型指針
int y = 2;
x = &y; // &y 取到 y 的地址,賦值給 x
std::cout << *x << std::endl; // *x 訪問指針指向數據的值
3. 常量和指針
指針本身具有兩個屬性:
- 指針本身
- 指針所指向的數據
指針所指向的數據可以是常量,也可以是變量;指針可以是常量,也可以是變量,即:
-
當指針所指向的數據爲變量,指針也是變量時,稱爲"指針變量"
int x = 5; int* y = &x; int z = 3; *y = 20; // *y 可以改變 x 的值 y = &z; // y 也可以指向其他地址
-
當指針所指向的數據爲常量,指針是變量時,稱爲"常指針"
const int x = 5; const int* y = &x; // const 意思是此指針指向的數據爲常量 int z = 10; *y = 20; // error,因爲指針指向的數據爲常量 y = &z; // y 可以指向其他地址
-
當指針所指向的數據爲變量,指針是常量時,稱爲"指針常量"
int x = 5; int* const y = &x; int z = 10; *y = 20; // *y 可以改變 x 的值 y = &z; // error,y 爲常量,不可以指向其他值
-
當指針所指向的數據爲常量,指針是常量時,稱爲"常指針常量"
const int x = 5; // 前一個 const 指明此指針指向的數據爲常量,後一個 const 指明此指針爲常量 const int* const y = &x; int z = 10; *y = 20; // error,*y 指向的 x 爲常量 y = &z; // error,y 爲常量
4. 指針的內存佈局
代碼:
const int a = 5;
int b = 9;
const int* pa = &a;
int* const pb = &b;
指針的內存佈局:
5. 總結
- *(指針)和 const(常量)誰在前先讀誰
- * 代表被指的數據,名字代表指針地址
- const 在誰前面就不允許誰改變,例如 const int * x; const 在 * 前面,即指針指向的數不能被修改;而 int * const y; const 在 y 前面,即指針的指向不能被修改