資源描述:
《指針是C語(yǔ)言中的重要概念》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、第9章指針指針是C語(yǔ)言中的重要概念,也是C語(yǔ)言的重要特色。使用指針,可以使程序更加簡(jiǎn)潔、緊湊、高效。9.1指針和指針變量的概念9.2指針變量的定義與應(yīng)用9.3數(shù)組的指針和指向數(shù)組的指針變量9.4字符串的指針和指向字符串的指針變量9.5返回指針值的函數(shù)9.6指針數(shù)組與主函數(shù)main()的形參9.7函數(shù)的指針和指向函數(shù)的指針變量[Return]9.1指針和指針變量的概念1.內(nèi)存地址──內(nèi)存中存儲(chǔ)單元的編號(hào)(1)計(jì)算機(jī)硬件系統(tǒng)的內(nèi)存儲(chǔ)器中,擁有大量的存儲(chǔ)單元(容量為1字節(jié))。為了方便管理,必須為每一個(gè)存儲(chǔ)單元編號(hào),這個(gè)編
2、號(hào)就是存儲(chǔ)單元的“地址”。每個(gè)存儲(chǔ)單元都有一個(gè)惟一的地址。(2)在地址所標(biāo)識(shí)的存儲(chǔ)單元中存放數(shù)據(jù)。注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個(gè)完全不同的概念。2.變量地址──系統(tǒng)分配給變量的內(nèi)存單元的起始地址假設(shè)有這樣一個(gè)程序:main(){intnum;scanf("%d",&num);printf("num=%d",num);}C編譯程序編譯到該變量定義語(yǔ)句時(shí),將變量num登錄到“符號(hào)表”中。符號(hào)表的關(guān)鍵屬性有兩個(gè):一是“標(biāo)識(shí)符名(id)”,二是該標(biāo)識(shí)符在內(nèi)存空間中的“地址(addr)”。為描述方便,假設(shè)系
3、統(tǒng)分配給變量num的2字節(jié)存儲(chǔ)單元為3000和3001,則起始地址3000就是變量num在內(nèi)存中的地址。3.變量值的存取──通過(guò)變量在內(nèi)存中的地址進(jìn)行系統(tǒng)執(zhí)行“scanf(”%d“,&num);”和“printf(”num=%d“,num);”時(shí),存取變量num值的方式可以有兩種:(1)直接訪問(wèn)──直接利用變量的地址進(jìn)行存取1)上例中scanf(“%d”,&num)的執(zhí)行過(guò)程是這樣的:用變量名num作為索引值,檢索符號(hào)表,找到變量num的起始地址3000;然后將鍵盤(pán)輸入的值(假設(shè)為3)送到內(nèi)存單元3000和30
4、01中。此時(shí),變量num在內(nèi)存中的地址和值,如圖9-1所示。2)printf("num=%d",num)的執(zhí)行過(guò)程,與scanf()很相似:首先找到變量num的起始地址3000,然后從3000和3001中取出其值,最后將它輸出。(2)間接訪問(wèn)──通過(guò)另一變量訪問(wèn)該變量的值C語(yǔ)言規(guī)定:在程序中可以定義一種特殊的變量(稱為指針變量),用來(lái)存放其它變量的地址。例如,假設(shè)定義了這樣一個(gè)指針變量num_pointer,它被分配到4000、4001單元,其值可通過(guò)賦值語(yǔ)句“num_pointer=#”得到。此時(shí),指
5、針變量num_pointer的值就是變量num在內(nèi)存中的起始地址3000,如圖9-1所示。通過(guò)指針變量num_pointer存取變量num值的過(guò)程如下:首先找到指針變量num_pointer的地址(4000),取出其值3000(正好是變量num的起始地址);然后從3000、3001中取出變量num的值(3)。(3)兩種訪問(wèn)方式的比較兩種訪問(wèn)方式之間的關(guān)系,可以用某人甲(系統(tǒng))要找某人乙(變量)來(lái)類(lèi)比。一種情況是,甲知道乙在何處,直接去找就是(即直接訪問(wèn))。另一種情況是,甲不知道乙在哪,但丙(指針變量)知道,此時(shí)甲可
6、以這么做:先找丙,從丙處獲得乙的去向,然后再找乙(即間接訪問(wèn))。4.指針與指針變量(1)指針──即地址一個(gè)變量的地址稱為該變量的指針。通過(guò)變量的指針能夠找到該變量。(2)指針變量──專(zhuān)門(mén)用于存儲(chǔ)其它變量地址的變量指針變量num_pointer的值就是變量num的地址。指針與指針變量的區(qū)別,就是變量值與變量的區(qū)別。(3)為表示指針變量和它指向的變量之間的關(guān)系,用指針運(yùn)算符“*”表示。例如,指針變量num_pointer與它所指向的變量num的關(guān)系,表示為:*num_pointer,即*num_pointer等價(jià)于變量
7、num。因此,下面兩個(gè)語(yǔ)句的作用相同:num=3;/*將3直接賦給變量num*/num_pointer=#/*使num_pointer指向num*/*num_pointer=3;/*將3賦給指針變量num_pointer所指向的變量*/[Return]9.2指針變量的定義與應(yīng)用9.2.1指針變量的定義與相關(guān)運(yùn)算[案例9.1]指針變量的定義與相關(guān)運(yùn)算示例。/*案例代碼文件名:AL9_1.C*/main(){intnum_int=12,*p_int;/*定義一個(gè)指向int型數(shù)據(jù)的指針變量p_int*/flo
8、atnum_f=3.14,*p_f;/*定義一個(gè)指向float型數(shù)據(jù)的指針變量p_f*/charnum_ch=’p’,*p_ch;/*定義一個(gè)指向char型數(shù)據(jù)的指針變量p_ch*/p_int=&num_int;/*取變量num_int的地址,賦值給p_int*/p_f=&num_f;/*取變量num_f的地址,賦值給p_f*/p_ch=&num_c