當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > 嵌入式學(xué)習(xí)筆記:指針和指針變量的區(qū)別(指針知識(shí)點(diǎn)大全)
嵌入式學(xué)習(xí)筆記:指針和指針變量的區(qū)別(指針知識(shí)點(diǎn)大全)
時(shí)間:2018-09-13 來源:未知
1.指針和地址
指針:指針在c語言中屬于一種類型,這種類型對(duì)應(yīng)的變量專門用于存儲(chǔ)地址
地址:存儲(chǔ)單元的編號(hào),用于區(qū)分不同的存儲(chǔ)單元,存儲(chǔ)在內(nèi)存中的每個(gè)數(shù)據(jù)都會(huì)有地址
例如:char ch;//分配一個(gè)字節(jié) short a;//分配兩個(gè)字節(jié)
注意:地址是一個(gè)常量
2.直接引用與間接引用
直接引用:表示通過變量名來引用(對(duì)變量讀與寫)
間接引用:通過指針類型變量來引用,即將變量地址存儲(chǔ)到指針變量中
√:使用*來表示指針類型
定義指針類型的變量:< 類型修飾符> * 變量名
例如:

理解:P是地址;*P是一個(gè)值 int*p是一個(gè)地址
注意:任何類型必須定義變量之后才會(huì)分配空間
區(qū)分:

一個(gè)指針變量所占用的空間,和操作的地址總線(硬件)的寬度有關(guān)系,一般為32位/64位,操作系統(tǒng)本身的能夠一次處理的數(shù)據(jù)大小有關(guān)
3.指針變量的初始化
指針變量在使用時(shí),一定要指向一個(gè)確定的存儲(chǔ)空間(賦值或者初始化),否則指向的位置是隨機(jī)的(稱為“野指針”)。如果不確定指針類型變量所指向的空間,可以初始化為NULL,如:int *p=NULL
注意:int *p=1000(錯(cuò)誤) 在有操作系統(tǒng)的情況下,不能給指針初始化一個(gè)常量
補(bǔ)充:如果不確定指針類型變量所指向的空間,可以初始化為NULL,對(duì)指向NULL的指針進(jìn)行間接運(yùn)算會(huì)產(chǎn)生"段錯(cuò)誤",解決方法如下:
Segmentation fault (core dumped) //出現(xiàn)段錯(cuò)誤
Gdb //來確定是第幾行
gdb a.out
執(zhí)行 r 命令
Program received signal SIGSEGV, Segmentation fault.
0x08048409 in main () at 03pointer.c:7
7 *p = 300;
(gdb) q
4指針變量作為函數(shù)參數(shù)
使用指針類型的變量作為函數(shù)的形式參數(shù),與普通變量的語法相同,寫成指針類型即可
例如:void swapy(int *pa,int *pb);
使用的指針類型的變量作為函數(shù)參數(shù),實(shí)際參數(shù)需要指定為地址或者其他的指針變量,同時(shí),形式參數(shù)也分為輸入的形式參數(shù)與輸出的形式參數(shù)
輸入的形式參數(shù),一般將實(shí)際參數(shù)的值傳遞給形式參數(shù)
輸出的形式參數(shù),一般通過指針進(jìn)行間接引用,可以返回調(diào)用這多個(gè)值
作用:主要用于解決:return 只能返回一個(gè)值的問題
具體例子(常用):output 函數(shù)的應(yīng)用


5指針與一維數(shù)組
數(shù)組及其元素同樣占有存儲(chǔ)單元,都有相應(yīng)的地址,所以指針即可以指向數(shù)組的元素,也可以指向數(shù)組
區(qū)別:數(shù)組名與數(shù)組首地址的區(qū)別

作用:

每個(gè)形式參數(shù)都需要分配空間,而且是獨(dú)立的空間
如果將數(shù)組整體進(jìn)行傳遞時(shí),產(chǎn)生一個(gè)形式參數(shù)數(shù)組,非常浪費(fèi)空間與時(shí)間
將數(shù)組的首元素的地址進(jìn)行傳遞
6.指針運(yùn)算
當(dāng)指針指向一段連續(xù)內(nèi)存空間某一個(gè)地址時(shí),比如指向數(shù)組元素時(shí),就可以進(jìn)行指針元素,一 般可以進(jìn)行如下的運(yùn)算:
自增/自減運(yùn)算:進(jìn)行加1運(yùn)算與減1運(yùn)算
求差值:兩個(gè)指針變量進(jìn)行減法運(yùn)算,前提是指向同一段內(nèi)存空間
賦值:將一個(gè)地址賦值給一個(gè)指針
定義一個(gè)一維數(shù)組與指針變量,并進(jìn)行指針運(yùn)算,包括++ / -- ,指針-指針,指針-數(shù)字
注意: int *ptr++ 先取值后++;

例子:Int i; int p=&I;


補(bǔ)充:(技巧性)追逐法確定第一、第二個(gè)最大值

7.指針與二維數(shù)組
C語言把二維數(shù)組看作是一維數(shù)組的集合,即二維數(shù)組是每一個(gè)元素為一維數(shù)組的特殊一維 數(shù)組,即二維數(shù)組的元素類型為一維數(shù)組
理解:二維數(shù)組的首地址---一維數(shù)組的首地址---一維數(shù)組的元素的地址---元素的值
一個(gè)*或[ ]降一級(jí) 一個(gè)&升一級(jí)
區(qū)分:

注:圖2最后一行錯(cuò)誤
8.指向一維數(shù)組的指針
指針變量存儲(chǔ)的地址對(duì)應(yīng)的變量的類型一般使用類型修飾符來確定
指針與二維數(shù)組的結(jié)合,一般為了方便操作行,就是需要使用指向一維數(shù)組的指針
指向一維數(shù)組的指針,用于存儲(chǔ)數(shù)組的地址(不是數(shù)組元素的地址)
例如:

9.指針數(shù)組
指針數(shù)組主要用于存儲(chǔ)地址的集合,每個(gè)元素都是存儲(chǔ)的一個(gè)地址
應(yīng)用:

補(bǔ)充:(函數(shù)性)strcmp 用于字符串比較

補(bǔ)充:(技巧性)冒泡排序法

字符串的排序:

10.指向指針的指針
存儲(chǔ)指針變量的地址,使用指向指針的指針
具體例子:

11. void *類型的指針
int *p ;//計(jì)算偏移 +1 偏移4個(gè)字節(jié),在進(jìn)行間接引用運(yùn)算(尋址運(yùn)算),操作4個(gè)字節(jié)
char *p ;//計(jì)算偏移 +1 偏移1個(gè)字節(jié),在進(jìn)行間接引用運(yùn)算(尋址運(yùn)算),操作1個(gè)字節(jié)
void *q ;//表示無類型的指針,可以存儲(chǔ)任何類型的地址,存儲(chǔ)時(shí)轉(zhuǎn)換成void *
void *的指針不允許進(jìn)行間接引用操作,因?yàn)椴恢罆?huì)操作幾個(gè)字節(jié)
作用:在函數(shù)中作為形式參數(shù)時(shí),可以提高對(duì)應(yīng)的通用性
int *p = (int *)q;//指針類型的強(qiáng)制轉(zhuǎn)換
具體例子:


