嵌入式學(xue)習筆記; c指(zhi)針詳解很詳細,學(xue)霸總結
時間:2018-09-12 來源:未知
1.1 定義
在計算機內部存(cun)儲器(簡(jian)稱(cheng)(cheng)內存(cun))中(zhong),每(mei)一個字節單元(yuan),都(dou)有一個編號,稱(cheng)(cheng)為(wei)地(di)(di)址(zhi)(zhi)。在C語言(yan)中(zhong),內存(cun)單元(yuan)的(de)地(di)(di)址(zhi)(zhi)稱(cheng)(cheng)為(wei)指(zhi)(zhi)針(zhen),專門(men)用來(lai)存(cun)放(fang)地(di)(di)址(zhi)(zhi)的(de)變量,稱(cheng)(cheng)為(wei)指(zhi)(zhi)針(zhen)變量(pointer variable)。在不影響理解的(de)情況下,把地(di)(di)址(zhi)(zhi)、指(zhi)(zhi)針(zhen)、指(zhi)(zhi)針(zhen)變量,都(dou)叫指(zhi)(zhi)針(zhen)。
1.2 指針類型
1.2.1 構成
目標類型 *
-------- -
| |
| +----->數據為地址
+----------->任何類型
1.2.2 編碼結構(gou);無符號整數(shu)
1.2.3 長度:與機器(qi)位數有關(guan)
1.2.4 字面(mian)常量(liang):NULL (void *)0 //表示指針變量(liang)中存(cun)的內容為(wei)0
注意(yi): izeof(指針)一定是等于(yu)計算機(ji)的位數,與(yu)目標類型無關。
1.3 定義指針變量(liang)
1.31 定(ding)義指針變量的方法(fa):
(1) 確定目標(變量)類型:char
(2) 確定(ding)指(zhi)針類型:char *
(3) 定義(yi)指(zhi)針變量:char *p;
實例:

實(shi)例:針(zhen)對c[2][3]

1.3.2 認識指(zhi)針變量(liang)
認識指針變量類(lei)型 ---> 認識目標類(lei)型
1.3.3 語法原理(注意觀(guan)察)
變(bian)量 變(bian)量的指針類型 指向變(bian)量的指針變(bian)量定義
int a; int * int *pl
int a[3]; int (*)[3] int (*pr)[3];
char *a[3] char *(*)[3] char *(*p)[3];
1.4 取地址運算
語法:
&a(變量, 數組, 函數)
1.5 賦值運算
1.5.1 語法:p = a;
1.5.2 操作(zuo)數(shu)類(lei)型:a和(he)p類(lei)型相同
1.5.3 運算法則
(1) a的類型和p不相同時,編譯器嘗試(shi)自動轉(zhuan)換:
a的(de)類型(xing)轉為p類型(xing), 但p最好是(shi)void * 所有(you)的(de)編譯(yi)器(qi)都(dou)行(xing)
(2) a--->p
1.5.4 結(jie)果(guo):p的值,結(jie)果(guo)的類(lei)型是a的類(lei)型。
1.5.5 寫運算的思(si)路(lu)
(1) 確定(ding)運算符
(2) 確定操作數(shu)(類(lei)型)
1.5.6 看運算的思(si)路:
(1) 確定操作數類型
(2) 確定運算法則(ze)
1.6 求目標
1.6.1 語(yu)法(fa):*p
1.6.2 操作數類型:p必須為指針類型,但不能(neng)是void*。
1.6.3 法(fa)則:如果p = &a; 則 *p 就是(shi)a
1.6.4 結果(guo):a
總結:px — 指針變(bian)量(liang),它的(de)內(nei)容是(shi)地址(zhi)量(liang)。
*px — 指(zhi)針所指(zhi)向(xiang)的(de)對象,它的(de)內容是數據。
&px — 指針變量占(zhan)用的存儲區域的地址,是個常量。
1.7 移動(dong)指向
1.7.1語(yu)法(fa)
p + n
p - n
p++, p--, ++p, --p
實例:

1.7.2操(cao)作(zuo)數類型
p:p必須為(wei)(wei)指針(zhen),最好為(wei)(wei)非void*類型,gcc允(yun)許(xu)對void*的指針(zhen)進行移(yi)動指向,但(dan)是其(qi)他編譯器不一定(ding)可(ke)以
n:n必須為整數(shu)
1.7.3 運算法(fa)則(ze)
p + n
向地址增加方向移動(dong)n個目(mu)標(biao), 即: p中的地址 + sizeof(目(mu)標(biao)類型也(ye)就是*p) * n
注意(yi):sizeof(p)的大小一(yi)直為4.注意(yi)是sizeof(*p)
gcc允許(xu)p為(wei)void*,p + n表示(shi)將p中的地(di)址(zhi)加(jia)n
p - n
向(xiang)(xiang)地址(zhi)減小方向(xiang)(xiang)移(yi)動n個目標, 即: p中的地址(zhi) - sizeof(目標類型(xing)) * n
p++
取p的(de)值(zhi),作為結(jie)果,然后(hou)p = p + 1
++p
p = p + 1,然(ran)后取p的值(zhi),作為(wei)結果
p—
取p的值,作為結果,然后p = p - 1
--p
p = p – 1,然后取p的(de)值,作為結果
注意(yi):函數類型(xing)的指(zhi)針不能做加減運算。
實例:

1.8 求指(zhi)針之間的目標個數
1.8.1 語法
p1 - p2
1.8.2 操作(zuo)數類型
p1和p2必(bi)須為(wei)相(xiang)同類型的指(zhi)針
如果p1和p2的類型(xing)都(dou)為void * 運算前(qian)都(dou)會被自動轉(zhuan)換(huan)為long類型(xing)
1.8.3. 運算法則
(1) p1和p2類(lei)型為非void * 時
(p1中的(de)地址 - p2中的(de)地址) / sizeof(目標類(lei)型(xing))
(2) p1和(he)p2的類型為void *時(可能會(hui)有編譯(yi)器(qi)不支(zhi)持)
p1中的地(di)址 - p2中的地(di)址
1.8.4 結果
目標個數
實例:


1.9 關系運算
>, >=, <, <=, ==, !=
都可以用到指(zhi)針類(lei)型數據(ju), 但通常只(zhi)用== 和 !=
1 語法
p1 == p2
2. 操(cao)作數類(lei)型
p1和(he)p2類型相(xiang)同
3. 運算法則
比(bi)較p1和p2中的(de)地址
4. 結果
布爾值
注意:指針(zhen)的(de)[]運算(suan)
1.語法(fa):p[n]
2.操作數類型:p 必(bi)須為指針或數組(zu),n 必(bi)須為整(zheng)數
3.運(yun)算法(fa)則:p[n] <==> *(p + n)
1.10指針常量
1.10.1定義:只讀的指(zhi)針變(bian)量
例子:
int a = 0;
int * const p1 = &a;(1)
const int *p2 = &a; (2)
int const *p3 = &a; (3)
const int * const p4 = &a; (4)
(1)中p1鎖(suo)定,不能p++,或(huo)者p=p+1等操作(zuo)
(2)中 int被鎖定(ding),a的值不能被修改,但(dan)p可以操作
(3)同(1)
(4)同(1)+(2)
注意:const int i;
int *const p = &i;//出現警告(gao),因(yin)為是常量(liang),但p認為,他的目標是可讀(du)可寫,權限增加(jia)
1.11 數組 vs 指針(zhen)
1.11.1 概念
指針(zhen)數組(zu): int * pa[5]; //實質是(shi)(shi)數組(zu),數組(zu)的元素是(shi)(shi)指針(zhen)
數組指(zhi)針: int (*pa)[5]; //實質(zhi)是(shi)指(zhi)針,目標類型(xing)是(shi)個(ge)數組
數組(zu)(zu)的指(zhi)(zhi)針(zhen):數組(zu)(zu)的指(zhi)(zhi)針(zhen)是(shi)指(zhi)(zhi)數組(zu)(zu)在內存中(zhong)的起始地(di)址(zhi),即第一個數組(zu)(zu)元素的地(di)址(zhi)。
1.11.2 一維數(shu)組 vs 指針
(1) 數組名(ming), 在運算(suan)(suan)中(zhong)(定義和聲(sheng)明除外(wai)都其他情(qing)況都是運算(suan)(suan),但sizeof和&運算(suan)(suan)外(wai)), 可以(yi)被理解成(cheng)指向第(di)1個元素的指針(常(chang)量)
(2) a[n] 等價(jia)于 *(a + n)
(3) &a[n] 等價于 a + n
總結:數組類型和指針類型都可(ke)以做[]運算(suan)
指針(zhen)變(bian)(bian)量和數(shu)組(zu)在(zai)訪問數(shu)組(zu)中(zhong)元素時(shi),一定條件下其具有相(xiang)同的(de)(de)形(xing)式(shi),因為指針(zhen)變(bian)(bian)量和數(shu)組(zu)名都是地址(zhi)(zhi)量。但指針(zhen)變(bian)(bian)量和數(shu)組(zu)的(de)(de)指針(zhen)(或叫數(shu)組(zu)名)在(zai)本質上不(bu)同,指針(zhen)變(bian)(bian)量是地址(zhi)(zhi)變(bian)(bian)量,而數(shu)組(zu)的(de)(de)指針(zhen)是地址(zhi)(zhi)常量
理解:由a[n]是一維數組可以得到:
(1) &a[n][0] 等價于(yu) a[n]
即: a[n], 在運算中, 可以被(bei)理解成a[n][0]的指(zhi)針
即: int *pl = a[n]; 語法正確
(2) a[n][m] 等價于 *(a[n] + m)
1.12字符指針與字符串
初始化(hua)字(zi)符指(zhi)針是(shi)把內存中字(zi)符串的首地(di)址賦予(yu)指(zhi)針,并不是(shi)把該字(zi)符串復制到指(zhi)針中。
注意:在C編程(cheng)中,當一(yi)個字(zi)符指(zhi)針(zhen)指(zhi)向一(yi)個字(zi)符串常量時,不能(neng)修改指(zhi)針(zhen)指(zhi)向的對(dui)象的值。
補充:多級指(zhi)針(zhen)(zhen):指(zhi)向指(zhi)針(zhen)(zhen)的指(zhi)針(zhen)(zhen)

