內(nèi)存空間的訪問方式
-
通過變量名訪問
-
通過地址訪問
指針的概念
-
指針:內(nèi)存地址,用于間接訪問內(nèi)存單元
-
指針變量:用于存放地址的變量
指針變量的定義
-
例:
static int i;
static int* ptr = &i;
-
例:
*ptr = 3;
與地址相關(guān)的運算——“*”和“&”
-
指針運算符
-
地址運算符:&
指針變量的初始化
-
語法形式
存儲類型 數(shù)據(jù)類型 *指針名=初始地址;
-
例:
int *pa = &a;
-
注意事項
-
用變量地址作為初值時,該變量必須在指針初始化之前已聲明過,且變量類型應(yīng)與指針類型一致。
-
可以用一個已有合法值的指針去初始化另一個指針變量。
-
不要用一個內(nèi)部非靜態(tài)變量去初始化 static 指針。
-
指針變量的賦值運算
-
語法形式
指針名=地址
注意:“地址”中存放的數(shù)據(jù)類型與指針類型必須相符
-
向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù),例如:
-
通過地址運算“&”求得已定義的變量和對象的起始地址
-
動態(tài)內(nèi)存分配成功時返回的地址
-
-
例外:整數(shù)0可以賦給指針,表示空指針。
-
允許定義或聲明指向 void 類型的指針。該指針可以被賦予任何類型對象的地址。
例: void *general;
指針空值nullptr
-
以往用0或者NULL去表達(dá)空指針的問題:
-
C/C++的NULL宏是個被有很多潛在BUG的宏。因為有的庫把其定義成整數(shù)0,有的定義成 (void*)0。在C的時代還好。但是在C++的時代,這就會引發(fā)很多問題。
-
-
C++11使用nullptr關(guān)鍵字,是表達(dá)更準(zhǔn)確,類型安全的空指針
例1 指針的定義、賦值與使用
1 //sample1.cpp 2 3 #include <iostream> 4 5 using namespace std; 6 7 int main() { 8 9 int i; //定義int型數(shù)i 10 11 int *ptr = &i; //取i的地址賦給ptr 12 13 i = 10; //int型數(shù)賦初值 14 15 cout << "i = " << i << endl; //輸出int型數(shù)的值 16 17 cout << "*ptr = " << *ptr << endl; //輸出int型指針?biāo)傅刂返膬?nèi)容 18 19 return 0; 20 21 } 22 23 運行結(jié)果: 24 25 i = 10 26 27 *ptr = 10
例2 void類型指針的使用
1 #include <iostream> 2 3 using namespace std; 4 5 int main() { 6 7 //!void voidObject; 錯,不能聲明void類型的變量 8 9 void *pv; //對,可以聲明void類型的指針 10 11 int i = 5; 12 13 pv = &i; //void類型指針指向整型變量 14 15 int *pint = static_cast<int *>(pv); //void指針轉(zhuǎn)換為int指針 16 17 cout << "*pint = " << *pint << endl; 18 19 return 0; 20 21 }
指向常量的指針
-
不能通過指向常量的指針改變所指對象的值,但指針本身可以改變,可以指向另外的對象。
-
例
int a;
const int *p1 = &a; //p1是指向常量的指針
int b;
p1 = &b; //正確,p1本身的值可以改變
*p1 = 1; //編譯時出錯,不能通過p1改變所指的對象
指針類型的常量
-
若聲明指針常量,則指針本身的值不能被改變。
-
例
int a;
int * const p2 = &a;
p2 = &b; //錯誤,p2是指針常量,值不能改變