下面隨筆給出C++指標筆記,
記憶體空間的訪問方式
-
通過變數名訪問
-
通過地址訪問
指標的概念
-
指標:記憶體地址,用于間接訪問記憶體單元
-
指標變數:用于存放地址的變數
指標變數的定義
-
例:
static int i;
static int* ptr = &i;
-
例:
*ptr = 3;
與地址相關的運算——“*”和“&”
-
指標運算子
-
地址運算子:&
指標變數的初始化
-
語法形式
存盤型別 資料型別 *指標名=初始地址;
-
例:
int *pa = &a;
-
注意事項
-
用變數地址作為初值時,該變數必須在指標初始化之前已宣告過,且變數型別應與指標型別一致,
-
可以用一個已有合法值的指標去初始化另一個指標變數,
-
不要用一個內部非靜態變數去初始化 static 指標,
-
指標變數的賦值運算
-
語法形式
指標名=地址
注意:“地址”中存放的資料型別與指標型別必須相符
-
向指標變數賦的值必須是地址常量或變數,不能是普通整數,例如:
-
通過地址運算“&”求得已定義的變數和物件的起始地址
-
動態記憶體分配成功時回傳的地址
-
-
例外:整數0可以賦給指標,表示空指標,
-
允許定義或宣告指向 void 型別的指標,該指標可以被賦予任何型別物件的地址,
例: void *general;
指標空值nullptr
-
以往用0或者NULL去表達空指標的問題:
-
C/C++的NULL宏是個被有很多潛在BUG的宏,因為有的庫把其定義成整數0,有的定義成 (void*)0,在C的時代還好,但是在C++的時代,這就會引發很多問題,
-
-
C++11使用nullptr關鍵字,是表達更準確,型別安全的空指標
例1 指標的定義、賦值與使用
1 //sample1.cpp 2 3 #include <iostream> 4 5 using namespace std; 6 7 int main() { 8 9 int i; //定義int型數i 10 11 int *ptr = &i; //取i的地址賦給ptr 12 13 i = 10; //int型數賦初值 14 15 cout << "i = " << i << endl; //輸出int型數的值 16 17 cout << "*ptr = " << *ptr << endl; //輸出int型指標所指地址的內容 18 19 return 0; 20 21 } 22 23 運行結果: 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指標轉換為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是指標常量,值不能改變
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262764.html
標籤:C++
