1指針
1.1語法:
【基類型*指針變量名】
【int *p=&a】
1
2
1.2語義:
【基類型】:指針變量指向的目標的數據類型
【*】:表示此時定義的變量是一個指針類型的變量
【&a】:一塊存放著int類型數據的空間的地址
【*p】:
通過指針間接訪問變量的過程:
(1)首先拿出p指針變量中的 值 (地址)到內存中定位(找內存單元的編號)
(2)從定位處開始,偏移出sizeof(基類型)大小的一塊空間(確定所需內存空間大小)
(3)把這塊空間當做一個基類型的變量來看 (檢索存儲值)
1
2
3
4
5
6
7
8
1.3指針變量的應用:
1.3.1在函數間傳遞信息(被調函數修改主調函數的數據)
1.兩步:
(1)將主調中想被修改的變量的地址傳給被調(【&】傳址)
(2)必須要做【*】運算(間接訪問),實現修改(【*】改值)
2.練習:
1:求兩個數的和
2:求兩個數中的大值,小值
1
?
3:使用指針將數組逆序
1
1.3.2用于處理數組的函數中
1.通過指針傳遞地址,函數可以直接操作源數據。(效率高)
2.要注意使用【const】關鍵字保護數組中的數據。
3.使用遞增遞減指針操作數組需要注意數據越界問題,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? c只保證指向數組及數組后面第一個位置的指針有效。
1.4指針相關操作
1.4.1取地址
【&】:
1
1.4.2間接訪問數據(解引用)
【*】:*運算符給出指針 指向地址上儲存的值
注意:
(1)未初始化的指針解引用的結果是未定義的(隨機值)。
1
2
3
1.4.3指針與整數相加
【p+1】:地址偏移
【p-1】:如果相減的結果超出了初始指針所指向數組的范圍,計算結果是未定義的。
1
2
1.4.4遞增指針
【p++】:
【p--】:
1
2
1.4.5指針的關系運算
【>】:
【>=】:
【<】:
【<=】:
【==】:
【!=】:
1
1.4.6指針減指針
前提:兩個指針是同一類型的指針
【p-q】:表示指針之間差了幾個基類型。
【p+q】:指針不能做加法運算。
1.5指針中的優先級問題
1.【*】的優先級高于【+】。
2.【*】和【++】的優先級相同,結合性是從右至左。
3.【*】的優先級低于【[? ]】。
1
2
3
1.6指針的應用
1.6.1系統數據存儲方式(大小端)
補充:
(1)野指針:指針指向不明確,隨機;故通常將指針初始化為NULL;【NULL】:表示0號地址
(2)未初始化的指針,不要進行解引用。(值存儲的位置不明確)
(3)數組的越界指針只有一個可以進行解引用:C只能保證指向數組任意元素的指針和指向數組后面第1個位置的指針有效。
(4)指針變量的格式轉換說明:
【%p】:
【%u】:
【%lu】:
1
2指針與數組
2.1數組指針
2.1.1一維數組
【int (*p)[2];】:p指向一個內含2個【int】類型值的數組的指針。
詳解:p是一個指針,指向一個數組,該數組有兩個元素。
1
2
2.1.2二維數組
【ar[3][2]】:ar是指向數組的指針,該數組內含2個int類型的元素
1
2.2指針數組
2.1.1一維數組
【int *p[2];】:p是一個內含2個指針的數組,每個指針都指向【int】類型的元素。
2.1.2二維數組
3指針與指針
3.1
3.2二級指針
3.2.1語法
【基類型 **p;】 ? ??
基類型:指針類型
p:二級指針變量名
3.2.2語義
指向指針的指針,用于指向一個指針的地址
理解:
1.指針變量
2.指針變量的地址
【*p】:一級指針本身
【**p】:二級指針所指向的變量值
【**p=a ? ?*p=&a ? ?p=&*p】?
【**p】: 二級指針變量(p)中存放的是一級指針變量(*p)的地址(&*p),
一級指針變量(*p)中存放的是基類型變量(a)的地址(&a),基類型變量的值(**p)。
【ar[i][j]】:二級指針變量(ar)中存放的是一級指針變量(ar[i])的地址(&ar[i]),一級指針變量(ar[i])中存放的是基類型變量(a,b,c,d...)的地址(&a,&b,&c,&d...),基類型變量的值(ar[i][j]),即(a,b,c,d...)。
3.2.3二級指針的應用
(1)二級指針主要用于多級數據之間的傳遞。
(2)傳遞一級指針的地址進函數,從而在函數內改變函數外一級指針的值,而一級指針的值可能為某個變量的地址。
1
2
4指針與函數
5.指針與【const】
5.1一級解引用
在一級解引用的前提下:
(1)【const】限定的指針可以指向普通指針和【const】限定的指針
(2)普通指針(非【const】限定的指針)只能指向普通指針
參照:【c primer plus 第6版-10.6.2-P557】
(3)【const* p】:不能改變指向的值。
(4)【*const p】:不能改變指向的地址。(理解:【*p】是取值,【p】是取地址)
1
6指針的兼容性
(1)不同的指針類型不具有兼容性(如int類型的指針不能兼容double類型的指針;指向指針的指針與指向數組的指針)
(2)