一、指針特點
? ? ? ? 1.讓代碼更加簡潔高效
? ? ? ? 2.提供直接訪問內存的操作
? ? ? ? 3.利用指針可以直接操作硬件
二、指針概念
(一)地址:為了區分內存中不同字節的編號(0到2^16-1)
(二)指針:指針就是地址,地址就是指針,指針地址多了指向的概念
(三)指針變量:存放指針(地址)的變量(64位操作系統中所有指針變量均為8個字節)
三、指針相關運算符
? ? ? ? 1.&:取地址運算符,獲得變量在內存空間中的首地址
? ? ? ? ? ? ? ? 1.1只有變量(左值(可以寫在等號左邊))才能&,常量和表達式不能進行&操作
????????????????1.2&構成的表達式為:變量在內存空間中的首地址
? ? ? ? ? ? ? ? ? ? ? ? int Num = 0;
? ? ? ? ? ? ? ? ? ? ? ? &Num:得到Num在內存空間4字節空間中的首地址
? ? ? ? ? ? ? ? 1.3&構成的表達式類型位:變量的類型升級后的類型
? ? ? ? ? ? ? ? ? ? ? ? int Num;
? ? ? ? ? ? ? ? ? ? ? ? &Num:int -> int *
? ? ? ? 2.*:獲得指針指向的空間,或者對應空間中的值
? ? ? ? ? ? ? ? 2.1*運算符連接的內容必須為指針類似,不能是普通變量類型
? ? ? ? ? ? ? ? 2.2如果直接使用*對應的表達式,表達式值為:該指針指向空間中的值
? ? ? ? ? ? ? ? ? ? ? ? *&Num;????????//獲取&Num指向的空間中int類型的值
? ? ? ? ? ? ? ? 2.3如果使用*對應的表達式其類型為:指針類型降級后的類型
? ? ? ? ? ? ? ? ? ? ? ? int *p;
? ? ? ? ? ? ? ? ? ? ? ? *p;//int * -> int
? ? ? ? ? ? ? ? 2.4*對應的表達式作為左值表示,將等號右邊的值放入指針指向的空間
四、指針變量的定義
? ? ? ? ? ? ? ? 不能使用未初始化的指針
(一)存儲類型 數據類型 *變量名
(二)野指針
? ? ? ? 定義:未經初始化的指針或者指向已經被釋放空間的指針
(三)空指針(NULL)
? ? ? ? 定義:指向內存空間為0x0的指針稱為空指針?
? ? ? ? ?內存地址0x0空間為只讀空間,不能復制,NULL指針不能執行*p = value操作
五、指針特性
? ? ? ? 變量的訪問形式
(一)直接訪問:通過變量的變量名訪問變量空間
(二)間接訪問:通過變量在內存中的地址訪問變量空間
六、指針的算術運算
(一)算術運算符
? ? ? ? 指針偏移的大小由指針指向的數據類型大小決定
? ? ? ? 兩個指針相減:兩個地址間相減數然后除數據類型
(二)不同指針類型之間的區別
? ? ? ? 1.*操作時處理方式不同
? ? ? ? 2.算數運算
六、指針常見操作
? ? ? ? 注意:指針有兩個需要請注意的概念:指針變量的本身,指針指向的空間。
? ? ? ? ? ? ? ? 1.對指針變量:p或者q修改,改變的是指針的指向
? ? ? ? ? ? ? ? 2.對*p或者*q:改變的是指針指向的空間,但是它的指向是不變的
七、指針作為函數參數
(一)值傳遞
? ? ? ? 1.實參將值傳給形參,形參值改變
? ? ? ? 2.函數體內部想使用函數體外部變量值的時候,使用值傳遞
(二)地址傳遞
? ? ? ? 1.實參將地址傳遞給形參,形參是指向實參的指針,可以利用形參修改實參的值
? ? ? ? 2.函數體內部想修改函數體外部變量的值的時候,使用地址傳遞
八、練習