嵌(qian)入式學習筆記(ji):指(zhi)針(zhen)和(he)指(zhi)針(zhen)變量的(de)區別(指(zhi)針(zhen)知識點大全(quan))
時間:2018-09-13 來源:未知(zhi)
1.指針和地址(zhi)
指針:指針在c語言(yan)中屬于(yu)一種(zhong)類型,這種(zhong)類型對應(ying)的變量專門用(yong)于(yu)存儲(chu)地址
地(di)址:存(cun)儲(chu)(chu)單(dan)元的(de)編號,用于(yu)區分不(bu)同的(de)存(cun)儲(chu)(chu)單(dan)元,存(cun)儲(chu)(chu)在內存(cun)中的(de)每個數據(ju)都會有地(di)址
例如:char ch;//分配一個字(zi)節(jie) short a;//分配兩個字(zi)節(jie)
注意(yi):地址(zhi)是一個常量
2.直接引(yin)用(yong)與(yu)間接引(yin)用(yong)
直接引用(yong)(yong):表示(shi)通過變量(liang)名來引用(yong)(yong)(對變量(liang)讀與寫)
間接引用:通過指(zhi)針類型變(bian)量來引用,即將變(bian)量地(di)址存儲到指(zhi)針變(bian)量中
√:使(shi)用*來表示(shi)指針類(lei)型
定義指針(zhen)類型的(de)變量:< 類型修(xiu)飾符(fu)> * 變量名
例如:

理解:P是(shi)地址(zhi);*P是(shi)一(yi)個(ge)值 int*p是(shi)一(yi)個(ge)地址(zhi)
注意:任(ren)何類型必須定義變量(liang)之(zhi)后才會分配空(kong)間
區分:

一個指(zhi)針變量(liang)所占用的(de)(de)空間(jian),和操(cao)作的(de)(de)地址總線(硬(ying)件(jian))的(de)(de)寬度有(you)(you)關系,一般(ban)為32位/64位,操(cao)作系統本(ben)身的(de)(de)能夠(gou)一次處理(li)的(de)(de)數據大小有(you)(you)關
3.指針(zhen)變(bian)量(liang)的初始(shi)化
指(zhi)針(zhen)變量在使用時,一定(ding)(ding)要(yao)指(zhi)向(xiang)一個確定(ding)(ding)的(de)(de)存儲空(kong)間(賦值或者初始化),否則指(zhi)向(xiang)的(de)(de)位置是(shi)隨機(ji)的(de)(de)(稱為“野指(zhi)針(zhen)”)。如(ru)(ru)果不確定(ding)(ding)指(zhi)針(zhen)類(lei)型(xing)變量所指(zhi)向(xiang)的(de)(de)空(kong)間,可以初始化為NULL,如(ru)(ru):int *p=NULL
注意:int *p=1000(錯誤(wu)) 在有操(cao)作系統的情況(kuang)下,不能給指針初始化(hua)一個常(chang)量
補充:如果不確定指針類型變量所(suo)指向的空間,可(ke)以初始化(hua)為(wei)NULL,對指向NULL的指針進行(xing)間接運算會產生"段錯誤(wu)",解決(jue)方法如下(xia):
Segmentation fault (core dumped) //出現段(duan)錯誤
Gdb //來確定是第幾行
gdb a.out
執行 r 命令
Program received signal SIGSEGV, Segmentation fault.
0x08048409 in main () at 03pointer.c:7
7 *p = 300;
(gdb) q
4指針變量作為函數參數
使用指(zhi)針類型(xing)的變量作(zuo)為函(han)數的形式參數,與普通變量的語法相(xiang)同,寫成(cheng)指(zhi)針類型(xing)即(ji)可
例如:void swapy(int *pa,int *pb);
使用的指針類型的變(bian)量作為(wei)(wei)函數參(can)數,實際參(can)數需要指定為(wei)(wei)地址或者其他的指針變(bian)量,同時,形(xing)(xing)式參(can)數也分為(wei)(wei)輸入的形(xing)(xing)式參(can)數與(yu)輸出的形(xing)(xing)式參(can)數
輸(shu)入(ru)的(de)形式(shi)參(can)數(shu),一般將實際參(can)數(shu)的(de)值傳遞給形式(shi)參(can)數(shu)
輸出的形式參數,一般通過指針進行(xing)間接引用(yong),可以返回調用(yong)這多個值
作用:主要用于解(jie)決:return 只能返回一個值的問(wen)題
具體例子(常用):output 函數(shu)的應用


5指針與一維數(shu)組(zu)
數組(zu)及其元素(su)同(tong)樣占有(you)(you)存儲單(dan)元,都有(you)(you)相應的地(di)址(zhi),所以指針(zhen)即可(ke)以指向(xiang)數組(zu)的元素(su),也可(ke)以指向(xiang)數組(zu)
區別(bie):數組(zu)名與數組(zu)首地址的(de)區別(bie)

作用:

每(mei)個(ge)形式參數都需要分配空(kong)間,而(er)且是獨立的(de)空(kong)間
如果(guo)將數組(zu)整體進行傳遞時,產生一個形式(shi)參數數組(zu),非常(chang)浪(lang)費空間與時間
將(jiang)數(shu)組的(de)首元素的(de)地(di)址進(jin)行傳遞
6.指針運算
當指針指向一(yi)段連續內存空間(jian)某(mou)一(yi)個(ge)地址時(shi),比(bi)如(ru)指向數組元(yuan)素(su)時(shi),就(jiu)可(ke)以進(jin)行(xing)指針元(yuan)素(su),一(yi) 般可(ke)以進(jin)行(xing)如(ru)下(xia)的運算:
自增/自減(jian)運(yun)算(suan):進行加1運(yun)算(suan)與減(jian)1運(yun)算(suan)
求差(cha)值(zhi):兩個指(zhi)針(zhen)變量進(jin)行(xing)減法(fa)運算,前提是指(zhi)向同一段內存(cun)空間
賦值:將一(yi)個地(di)址賦值給一(yi)個指針
定義(yi)一(yi)個(ge)一(yi)維數組與指(zhi)針(zhen)(zhen)(zhen)變(bian)量,并進行(xing)指(zhi)針(zhen)(zhen)(zhen)運算,包括(kuo)++ / -- ,指(zhi)針(zhen)(zhen)(zhen)-指(zhi)針(zhen)(zhen)(zhen),指(zhi)針(zhen)(zhen)(zhen)-數字
注(zhu)意: int *ptr++ 先取(qu)值后(hou)++;

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


補充:(技巧性)追(zhui)逐法確定第一(yi)、第二個最大值

7.指針(zhen)與(yu)二維數組
C語言把二(er)(er)維(wei)(wei)(wei)數(shu)組看作(zuo)是一(yi)維(wei)(wei)(wei)數(shu)組的集合,即(ji)二(er)(er)維(wei)(wei)(wei)數(shu)組是每一(yi)個元素為一(yi)維(wei)(wei)(wei)數(shu)組的特殊一(yi)維(wei)(wei)(wei) 數(shu)組,即(ji)二(er)(er)維(wei)(wei)(wei)數(shu)組的元素類(lei)型為一(yi)維(wei)(wei)(wei)數(shu)組
理(li)解(jie):二維數(shu)(shu)組(zu)的(de)(de)首(shou)(shou)地址(zhi)(zhi)---一(yi)維數(shu)(shu)組(zu)的(de)(de)首(shou)(shou)地址(zhi)(zhi)---一(yi)維數(shu)(shu)組(zu)的(de)(de)元(yuan)(yuan)素的(de)(de)地址(zhi)(zhi)---元(yuan)(yuan)素的(de)(de)值
一(yi)(yi)(yi)個*或[ ]降一(yi)(yi)(yi)級 一(yi)(yi)(yi)個&升一(yi)(yi)(yi)級
區分:

注:圖2最后一行(xing)錯誤(wu)
8.指(zhi)向一維(wei)數組的指(zhi)針
指針變量(liang)存儲的(de)地(di)址對(dui)應的(de)變量(liang)的(de)類型一般使用類型修飾符來確定
指針與二維數組的結合(he),一(yi)般(ban)為了方便操作行,就是需要(yao)使用指向一(yi)維數組的指針
指向(xiang)一維數(shu)組的指針,用于存儲數(shu)組的地(di)址(zhi)(不是數(shu)組元素的地(di)址(zhi))
例如:

9.指針數組
指針數組主(zhu)要(yao)用于存(cun)儲地址(zhi)的(de)集合,每個元素(su)都是存(cun)儲的(de)一(yi)個地址(zhi)
應用:

補充:(函數性)strcmp 用于(yu)字符串比(bi)較(jiao)

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

字符串的排序:

10.指向指針的指針
存儲指(zhi)(zhi)針變(bian)量的地址(zhi),使用(yong)指(zhi)(zhi)向(xiang)指(zhi)(zhi)針的指(zhi)(zhi)針
具體例子:

11. void *類(lei)型的(de)指(zhi)針(zhen)
int *p ;//計算(suan)(suan)偏移 +1 偏移4個字節,在進(jin)行間接(jie)引用運算(suan)(suan)(尋址運算(suan)(suan)),操作(zuo)4個字節
char *p ;//計(ji)算偏(pian)移 +1 偏(pian)移1個(ge)字(zi)節(jie),在進(jin)行間(jian)接引用運(yun)算(尋址運(yun)算),操作1個(ge)字(zi)節(jie)
void *q ;//表示無類型(xing)的指針,可以存儲(chu)任何(he)類型(xing)的地(di)址,存儲(chu)時轉換成void *
void *的(de)指針(zhen)不允許進行間(jian)接引用操作,因為不知(zhi)道會操作幾個字節
作(zuo)用:在函(han)數中(zhong)作(zuo)為形式參數時,可以提高對應的(de)通用性(xing)
int *p = (int *)q;//指針類型(xing)的強制(zhi)轉(zhuan)換
具體例子:


