計(jì)算機(jī)設(shè)計(jì)語(yǔ)言(c語(yǔ)言)t7_第1頁(yè)
計(jì)算機(jī)設(shè)計(jì)語(yǔ)言(c語(yǔ)言)t7_第2頁(yè)
計(jì)算機(jī)設(shè)計(jì)語(yǔ)言(c語(yǔ)言)t7_第3頁(yè)
計(jì)算機(jī)設(shè)計(jì)語(yǔ)言(c語(yǔ)言)t7_第4頁(yè)
計(jì)算機(jī)設(shè)計(jì)語(yǔ)言(c語(yǔ)言)t7_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第7章章 指指 針針 指針指針是是C 語(yǔ)言中的一個(gè)重語(yǔ)言中的一個(gè)重要概念,是要概念,是C 語(yǔ)言的語(yǔ)言的 精華精華。1. 內(nèi)存單元地址內(nèi)存單元地址程序中定義了變量后,在程序中定義了變量后,在編譯時(shí)編譯時(shí)系統(tǒng)就給這個(gè)變量分配內(nèi)存單元。系統(tǒng)就給這個(gè)變量分配內(nèi)存單元。內(nèi)存中每一個(gè)內(nèi)存單元都有一個(gè)編號(hào),這就是內(nèi)存中每一個(gè)內(nèi)存單元都有一個(gè)編號(hào),這就是“地址地址”。內(nèi)存單元地址內(nèi)存單元地址 就是編譯后系統(tǒng)分配給變量的就是編譯后系統(tǒng)分配給變量的內(nèi)存空間位置內(nèi)存空間位置。例如:例如: int i , j, k; 7.1 地址和指針的概念地址和指針的概念內(nèi)存用戶數(shù)據(jù)區(qū)內(nèi)存用戶數(shù)據(jù)區(qū)變量k變量j變量i200020

2、022004其中其中2000為為 i 的地址的地址 2002為為 j 的地址的地址 2004為為 k 的地址的地址 數(shù)據(jù)在內(nèi)存中的存取方式:數(shù)據(jù)在內(nèi)存中的存取方式:直接訪問(wèn)方式直接訪問(wèn)方式 和和 間接訪問(wèn)方式。間接訪問(wèn)方式。 直接訪問(wèn)方式:直接訪問(wèn)方式:按變量地址存取變量值。按變量地址存取變量值。間接訪問(wèn)方式:間接訪問(wèn)方式: 把一個(gè)變量的地址放在另一個(gè)變量中把一個(gè)變量的地址放在另一個(gè)變量中。 內(nèi)存單元的內(nèi)容內(nèi)存單元的內(nèi)容 內(nèi)存單元內(nèi)存單元中存放的中存放的數(shù)值數(shù)值。 例如:例如:i=3 ;j=6 ; 在在2000單元中存放數(shù)值單元中存放數(shù)值 3,3 即為即為內(nèi)容內(nèi)容。 在在2002單元中存放數(shù)值

3、單元中存放數(shù)值 6,6 即為即為內(nèi)容內(nèi)容。變量 i變量 j 6320002002例:例: printf(%d, i ) ;其執(zhí)行是這樣的:其執(zhí)行是這樣的:根據(jù)變量名與地址的對(duì)應(yīng)關(guān)系根據(jù)變量名與地址的對(duì)應(yīng)關(guān)系,找到變,找到變量量i 的地址的地址2000,然后從由,然后從由2000開始的兩個(gè)字節(jié)中取出數(shù)據(jù)(即變開始的兩個(gè)字節(jié)中取出數(shù)據(jù)(即變量的值量的值3),把它輸出。),把它輸出。這種按變量地址存取變量值的方式稱為這種按變量地址存取變量值的方式稱為“直接訪問(wèn)直接訪問(wèn)”方式。方式。例如,我們定義一個(gè)變量例如,我們定義一個(gè)變量 i_pointer ,用來(lái)存放整型變量,用來(lái)存放整型變量i 的地址:的地址

4、: i_pointer = &i ; /* 把變量把變量 i 的地址的地址賦給變量賦給變量 i_pointer */這時(shí)這時(shí)i_pointer的值的值 就是變量就是變量 i 所占用的內(nèi)存單元的所占用的內(nèi)存單元的起始地址起始地址(2000)。)。如何存取變量如何存取變量i 的值?的值?變量 i變量 j 20006320002002變量變量i_pointer3010間接訪問(wèn)方式間接訪問(wèn)方式: 通過(guò)存儲(chǔ)在某一個(gè)內(nèi)存單元中的地址去存取該地址所通過(guò)存儲(chǔ)在某一個(gè)內(nèi)存單元中的地址去存取該地址所指向的內(nèi)存單元中的變量值。指向的內(nèi)存單元中的變量值。 要存取變量要存取變量i 的值,的值,先要找到存放先要找

5、到存放i 的地址的的地址的變量(變量(i_pointer),從中),從中取出取出i 的地址(的地址(2000),),然后到然后到2000、2001字節(jié)字節(jié)中取出中取出i 的值(的值(3)。)。表示將數(shù)值表示將數(shù)值3送到變量中,有兩種方法:送到變量中,有兩種方法:將將3 送到變量送到變量i 所標(biāo)志的單元中。所標(biāo)志的單元中。將將3 送到變量送到變量i_pointer 所所“指向指向”的單元中的單元中。 所謂所謂“指向指向”就是通過(guò)地址來(lái)體現(xiàn)的就是通過(guò)地址來(lái)體現(xiàn)的。(如右圖所示)(如右圖所示) 由于通過(guò)地址可以找到所需的變量單元,因此可以說(shuō),由于通過(guò)地址可以找到所需的變量單元,因此可以說(shuō),地址地址“

6、指向指向”該該內(nèi)存單元內(nèi)存單元。在。在C 語(yǔ)言中,語(yǔ)言中,將地址形象化地稱為將地址形象化地稱為“指針指針”。 一個(gè)變量的地址稱為該變量的一個(gè)變量的地址稱為該變量的“指針指針”。例如地址。例如地址2000是變量是變量i的指針的指針。 如果有一個(gè)變量,專門用來(lái)存放另一個(gè)變量的地址(即指針),則它稱如果有一個(gè)變量,專門用來(lái)存放另一個(gè)變量的地址(即指針),則它稱為為“指針變量指針變量 ”。如前面所說(shuō)的。如前面所說(shuō)的i_pointer變量稱為變量稱為指針變量。指針變量。指針變量的值指針變量的值是指針(地址)。是指針(地址)。注意:注意: (1) “指針指針” 和和 “指針變量指針變量” 這兩個(gè)不同的概念

7、。這兩個(gè)不同的概念。(2) 通過(guò)指針變量如何訪問(wèn)變量通過(guò)指針變量如何訪問(wèn)變量 i 的值?的值? (間接訪問(wèn)間接訪問(wèn))2000i32000i32000i_pointer 變量的指針變量的指針就是變量的地址。存放變量地址的變量是就是變量的地址。存放變量地址的變量是指針變量,指針變量,用來(lái)指用來(lái)指向另一個(gè)變量。向另一個(gè)變量。 指針變量和它所指向的變量之間,用指針變量和它所指向的變量之間,用“ * ” 表示表示“ 指向指向”。例如例如 i_pointer代表指針變量,代表指針變量,* i_pointer 是是i_pointer所指向的變量。所指向的變量。 7.2 變量的指針和指向變量的指針變量變量的指

8、針和指向變量的指針變量* i_pointer200032000i_pointeri可以看到,可以看到,* i_pointer也代表一個(gè)變也代表一個(gè)變量,它和變量量,它和變量i 是同一回事。下面兩是同一回事。下面兩個(gè)語(yǔ)句作用相同:個(gè)語(yǔ)句作用相同: i=3; * i_pointer=3;第第個(gè)語(yǔ)句的含義是將個(gè)語(yǔ)句的含義是將3 賦給指針變賦給指針變量量i_pointer所指向的變量。所指向的變量。7.2.1 定義一個(gè)指針變量定義一個(gè)指針變量指針變量是專門用來(lái)存放地址的,因此必須定義為指針變量是專門用來(lái)存放地址的,因此必須定義為“ 指針類型指針類型”。指針變量定義的一般形式指針變量定義的一般形式: 基

9、類型基類型 * 指針變量名指針變量名指針變量的基類型指針變量的基類型 用來(lái)指定該指針變量可以指向的變量的類型。用來(lái)指定該指針變量可以指向的變量的類型。 例如例如: int *pointer_1,*pointer_2 ;(指向整型變量的指針變量)float *pointer_3;(指向?qū)嵭妥兞康闹羔樧兞浚ヽhar *pointer_4;(指向字符型變量的指針變量)注意注意: 1. 指針變量前面的指針變量前面的“ * ” 表示該變量是指針變量。表示該變量是指針變量。 指針變量名指針變量名是是 pointer_1、pointer_2 ,而不是,而不是*pointer_1、*pointer_2 .2.

10、 在定義指針變量時(shí)必須指定基類型。在定義指針變量時(shí)必須指定基類型。 不同類型的數(shù)據(jù)在內(nèi)存中所占的字節(jié)數(shù)是不同的。不同類型的數(shù)據(jù)在內(nèi)存中所占的字節(jié)數(shù)是不同的。指針變量的類型說(shuō)明指針變量的類型說(shuō)明 是為了告訴系統(tǒng)按變量中的地址從內(nèi)存選取是為了告訴系統(tǒng)按變量中的地址從內(nèi)存選取幾個(gè)字節(jié)幾個(gè)字節(jié)的數(shù)據(jù)進(jìn)行操作,便于的數(shù)據(jù)進(jìn)行操作,便于 指針的移動(dòng)和指針的運(yùn)算操作。指針的移動(dòng)和指針的運(yùn)算操作。3. 一個(gè)指針變量只能一個(gè)指針變量只能 指向同一類型的變量,即存放同一類型變量的地址。指向同一類型的變量,即存放同一類型變量的地址。怎樣使一個(gè)指針變量指向另一個(gè)變量呢?怎樣使一個(gè)指針變量指向另一個(gè)變量呢? 可以使用賦

11、值語(yǔ)句??梢允褂觅x值語(yǔ)句。例如:例如: float x ;char ch ;float * pointer_3 ;char * pointer_4 ;pointer_3 = &x ;pointer_4 = &ch ;例:例:int k, i=5;int *pointer;pointer=&i ;k = *pointer ;printf(%d, k);printf(%d , *pointer) ; 2000(地址地址)pointer20005(數(shù)據(jù)數(shù)據(jù))*pointeri2000輸出變量輸出變量 i 的值的值5k的值為57.2.2 指針變量的引用指針變量的引用指針變量中只

12、能存放地址(指針)指針變量中只能存放地址(指針),不能將一個(gè)整型量或任何其它,不能將一個(gè)整型量或任何其它非地址類型的數(shù)據(jù)賦給一個(gè)指針變量。非地址類型的數(shù)據(jù)賦給一個(gè)指針變量。例如賦值語(yǔ)句:例如賦值語(yǔ)句:pointer_1=2000; (不合法)(不合法)有關(guān)地址的運(yùn)算符有關(guān)地址的運(yùn)算符: 1. & 取地址運(yùn)算符。取地址運(yùn)算符。2. * 指針運(yùn)算符(或稱指針運(yùn)算符(或稱“間接訪問(wèn)間接訪問(wèn)”運(yùn)算符)。運(yùn)算符)。例如例如: &a - 表示變量表示變量a的地址的地址 *p - 表示指針變量表示指針變量p 所指向的變量所指向的變量 ( 地址地址p所指的單元中存放的值所指的單元中存放的值 )

13、main( ) int a , b; int *pointer_1 ,*pointer_2; /*定義指針變量定義指針變量,指向整型變量指向整型變量*/ a=100; b=10; pointer_1=&a ; /* 使使pionter_1指向指向a */ pointer_2=&b ; /* 使使pionter_2指向指向b */ printf(%d,%dn, a , b) ; printf(%d,%dn, *pointer_1 , *pointer_2) ;例例7.1 通過(guò)指針變量訪問(wèn)整型變量。通過(guò)指針變量訪問(wèn)整型變量。運(yùn)行結(jié)果:運(yùn)行結(jié)果:100,10100,10&a(

14、地址地址)pointer_1100(數(shù)據(jù)數(shù)據(jù))*pointer_1a&b(地址地址)pointer_210(數(shù)據(jù)數(shù)據(jù))*pointer_2bpointer_1 指向指向a,*pointer_1 就是變量就是變量a 。pointer_2 指向指向b, *pointer_2就是變量就是變量b 。& 和和 * 的優(yōu)先級(jí)相同,按的優(yōu)先級(jí)相同,按自右向左自右向左方向結(jié)合。因此,方向結(jié)合。因此,先執(zhí)行先執(zhí)行*pointer_1 的運(yùn)算,的運(yùn)算,它的執(zhí)行結(jié)果就是變量它的執(zhí)行結(jié)果就是變量 a ,再執(zhí)行再執(zhí)行& 運(yùn)算,則運(yùn)算,則&*pointer_1的最后結(jié)果與的最后結(jié)果與 &a

15、mp;a 相同,相同, 即取變量即取變量 a 的地的地址。址。(見圖示1) &a &bpointer_2b apointer_1圖示1*pointer_1*pointer_2a &a &apointer_2bpointer_1圖示2*pointer_2*pointer_1下面對(duì)下面對(duì) “&” 和和 “ * ” 運(yùn)算符再做些說(shuō)明運(yùn)算符再做些說(shuō)明: 如有如有 pointer_1=&a ; pointer_2=&b ; 則則 表達(dá)式表達(dá)式 &*pointer_1 的含義是什么?的含義是什么?pointer_2=&a; 如果有如果

16、有 pointer_2=&*pointer_1; 則結(jié)果如何?則結(jié)果如何? 先執(zhí)行先執(zhí)行 &a 運(yùn)算,得運(yùn)算,得 a 的地址,再執(zhí)行的地址,再執(zhí)行 * 運(yùn)算,運(yùn)算,得變量得變量 a 的值。的值。所以所以 , 表達(dá)式表達(dá)式 *&a 和表達(dá)式和表達(dá)式 *pointer_1 的含義是相同的,它們等價(jià)于變量的含義是相同的,它們等價(jià)于變量a。 即即*&a 與與a 等價(jià)。等價(jià)。 (3) (*pointer_1)+ 相當(dāng)于相當(dāng)于 a+, 變量變量a 的值加的值加1。(4) *pointer_1+ 相當(dāng)于相當(dāng)于 *(pointer_1+)。這是由于這是由于* 和和 + + 優(yōu)先

17、級(jí)別相同,結(jié)合方向是優(yōu)先級(jí)別相同,結(jié)合方向是自右而左自右而左。+ 在在pointer_1的右側(cè),是的右側(cè),是“后加后加”,因此,因此先執(zhí)行先執(zhí)行 *pointer_1,取取出出 a 的值的值,然后,然后指針指針 pointer_1加加1,這時(shí),這時(shí)pointer_1就不再指向就不再指向a 了。了。注意:注意: (3) 和和(4) 的運(yùn)算結(jié)果是不同的。的運(yùn)算結(jié)果是不同的。apointer_1 &a5* pointer_1 * &a(2) 如有如有 pointer_1=&a ; 則表達(dá)式則表達(dá)式 *&a 的含義是什么?的含義是什么?main() int a , b

18、,*p1 , *p2 , *p; scanf(%d,%d, &a , &b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(a=%d,b=%dn, a , b); printf(max=%d,min=%dn,*p1 ,*p2);例例7.2 輸入整數(shù)輸入整數(shù)a和和b,按先大后小的順序輸出,按先大后小的順序輸出a和和b 。 &a &b p1p2 5 9 ab p &b &a p1p2 5 9 ab p&a運(yùn)行結(jié)果運(yùn)行結(jié)果: a=5 , b=9 max=9 , min=5實(shí)際上并

19、沒(méi)有交換實(shí)際上并沒(méi)有交換a 和和b。算法不交換整型變量。算法不交換整型變量的值(變量的值(變量a和和 b中的值沒(méi)有改變),而是交換中的值沒(méi)有改變),而是交換兩個(gè)指針變量的值(即變量?jī)蓚€(gè)指針變量的值(即變量a和和 b的地址),使的地址),使p1指向大的數(shù),指向大的數(shù),p2指向小的數(shù)。指向小的數(shù)。一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)元素在內(nèi)存中占用一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)元素在內(nèi)存中占用存儲(chǔ)單元,它們也應(yīng)該有相應(yīng)的地址。一個(gè)變量既然可以指向變量,當(dāng)然存儲(chǔ)單元,它們也應(yīng)該有相應(yīng)的地址。一個(gè)變量既然可以指向變量,當(dāng)然也可以指向數(shù)組和數(shù)組元素。也可以指向數(shù)組和數(shù)組元素。所謂所謂數(shù)

20、組的指針數(shù)組的指針是指是指 數(shù)組的數(shù)組的起始地址。起始地址。數(shù)組元素的指針數(shù)組元素的指針是是數(shù)組元素的地址數(shù)組元素的地址 。例如:例如:int a10 , i , *p, *p1;p= a; 或或 p=&a0 ;p1=&a6 ;a0a1a6. . . . .&a0&a1&a6 app1=&a6p17.3 數(shù)組的指針和指向數(shù)組的指針變量數(shù)組的指針和指向數(shù)組的指針變量 引用數(shù)組元素可以用下標(biāo)法(如引用數(shù)組元素可以用下標(biāo)法(如a3),也可以用指針?lè)?,即通過(guò)指向數(shù)組元也可以用指針?lè)ǎ赐ㄟ^(guò)指向數(shù)組元素的指針找到所需的元素。使用指針?lè)ㄋ氐闹羔樥业剿璧脑?/p>

21、。使用指針?lè)苁鼓繕?biāo)程序質(zhì)量高(占用內(nèi)存少,運(yùn)能使目標(biāo)程序質(zhì)量高(占用內(nèi)存少,運(yùn)行速度快)。行速度快)。7.3.1 指向數(shù)組元素的指針指向數(shù)組元素的指針例如例如: int a10; int *p; . p=&a0; 指向數(shù)組元素的指針變量,其定義與普通指針變量的定義相同。指向數(shù)組元素的指針變量,其定義與普通指針變量的定義相同。把元素把元素a0 的地址賦給的地址賦給 p, 即即p指向指向 數(shù)組數(shù)組a 的第的第0個(gè)元個(gè)元素。素。 因?yàn)閿?shù)組名表示數(shù)組的首地址,所以它因?yàn)閿?shù)組名表示數(shù)組的首地址,所以它 等價(jià)于等價(jià)于 p=a ;應(yīng)注意數(shù)組應(yīng)注意數(shù)組a 并不代表整個(gè)數(shù)組并不代表整個(gè)數(shù)組,而是把數(shù)組

22、,而是把數(shù)組a 的首地址的首地址賦給指針變量賦給指針變量p,不是把數(shù)組,不是把數(shù)組a 的各個(gè)元素賦給的各個(gè)元素賦給p。 指針變量定義的同時(shí)指針變量定義的同時(shí) 可以可以賦初值賦初值:int a10;int *p=&a0; 定義時(shí)也可以寫成如下形式:定義時(shí)也可以寫成如下形式:int *p=a;相當(dāng)于相當(dāng)于 int *p; p=&a0;a 數(shù)組數(shù)組a0a1a2aip*(p+i)a10&a0假設(shè)已經(jīng)定義了數(shù)組和一個(gè)指針變量假設(shè)已經(jīng)定義了數(shù)組和一個(gè)指針變量 int a10; int *p=a; . *p=1;數(shù)組元素的引用可以用數(shù)組元素的引用可以用 1. 下標(biāo)法下標(biāo)法: ai2.

23、 指針?lè)ㄖ羔樂(lè)? *(a+i) 或或 *(p+i) 其中其中p 為指向數(shù)組為指向數(shù)組a 的指針的指針變量,初值變量,初值 p=a;下標(biāo)法比較直觀下標(biāo)法比較直觀,程序容易閱讀程序容易閱讀指針表示指針表示7.3.2 通過(guò)指針引用數(shù)組元素通過(guò)指針引用數(shù)組元素對(duì)對(duì)p 當(dāng)前所指的當(dāng)前所指的元素元素 賦整數(shù)值賦整數(shù)值1注意注意: 1.C規(guī)定規(guī)定 :p+1 (或或p+) 指向同一數(shù)組的下指向同一數(shù)組的下一個(gè)元素一個(gè)元素 (不是地址值簡(jiǎn)單加不是地址值簡(jiǎn)單加1)。p+1代代表的實(shí)際地址是表的實(shí)際地址是 p+1d(d是一個(gè)數(shù)組是一個(gè)數(shù)組元素所占的字節(jié)數(shù))。元素所占的字節(jié)數(shù))。2.當(dāng)當(dāng) p 的初值為的初值為 a 的

24、首地址時(shí)的首地址時(shí), p+i 或或 a+i 就是就是ai 的地址,因?yàn)榈牡刂?,因?yàn)?a 代表了數(shù)組的代表了數(shù)組的首地址。首地址。3.*(p+i) 或或*(a+i) 所指的數(shù)組元素就是所指的數(shù)組元素就是ai 的內(nèi)容。的內(nèi)容。 實(shí)際上,實(shí)際上, 是變址運(yùn)算符,是變址運(yùn)算符,對(duì)對(duì)ai 的處理,是將的處理,是將ai 按按a+i 計(jì)算地址計(jì)算地址,然后找出此地址單元中的值。,然后找出此地址單元中的值。4.指向數(shù)組的指針變量也可以帶下標(biāo)指向數(shù)組的指針變量也可以帶下標(biāo), 如如: pi 等價(jià)于等價(jià)于*(p+i) ,即,即ai 。a 數(shù)組數(shù)組a0a1a2aip+1 或或 a+1pp+2 或或 a+2p+i 或或

25、 a+i*(p+i)p+9 或或 a+9a9例例7.5 輸出數(shù)組中全部元素輸出數(shù)組中全部元素 :四種方法。種方法。 main( ) int a10=1,2,3,4,5,6,7,8,9,10; int *p, i ; printf(n下標(biāo)法下標(biāo)法:n) ; for(i=0 ; i10 ; i+) printf(%d, ai) ; printf(n指針?lè)ㄖ羔樂(lè)?數(shù)組名數(shù)組名):n); for(i=0 ; i10 ; i+) printf(%d, *(a+i) ; printf(n指針?lè)ㄖ羔樂(lè)?指針變量指針變量):n) ; p=a; for(i=0 ; i10 ; i+) printf(%d, *(

26、p+i) ; printf(n指針?lè)ㄖ羔樂(lè)?指針變量指針變量):n) ; for(p=a ; pa+10 ; p+) printf(%d ,*p) ; printf(n) ; 否!否!a+的操作是非法的,因的操作是非法的,因 a是常量是常量。能否改成如下形式能否改成如下形式? for(p=a;ap+10; a+) printf(%d,*a)幾種方法的比較:幾種方法的比較:1)下標(biāo)法和指針?lè)ǎ〝?shù)下標(biāo)法和指針?lè)ǎ〝?shù)組名)執(zhí)行效果是相組名)執(zhí)行效果是相同的。編譯系統(tǒng)先將同的。編譯系統(tǒng)先將ai 轉(zhuǎn)換為轉(zhuǎn)換為*(a+i),即,即先計(jì)算元素地址,因先計(jì)算元素地址,因此這兩種方法找數(shù)組此這兩種方法找數(shù)組元素

27、比較費(fèi)時(shí)。元素比較費(fèi)時(shí)。2)指針變量法是直接指指針變量法是直接指向數(shù)組元素,向數(shù)組元素,p+的自的自加操作比較快加操作比較快。3)用下標(biāo)法比較直觀用下標(biāo)法比較直觀。例例 7.6 通過(guò)指針變量輸入輸出數(shù)組通過(guò)指針變量輸入輸出數(shù)組 a 的的10個(gè)元素個(gè)元素 main( ) int *p , i , a10 ;p=a ;for(i=0 ; i10 ; i+ ) scanf(%d, &ai ) ;printf(n) ; p=a ;for(i=0; i10 ; i+ ) printf(%d, * p+) ; 如果輸出時(shí)沒(méi)有語(yǔ)句如果輸出時(shí)沒(méi)有語(yǔ)句 p=a; 程序?qū)⒊绦驅(qū)?? P是地址,是地址,不要

28、加不要加 &出錯(cuò),因輸入時(shí)已改變了指針出錯(cuò),因輸入時(shí)已改變了指針 p 的指向。的指向。 p+a 數(shù)組數(shù)組a0a1aip+pa9(1) p+(或或 p+=1),使,使 p指向下一個(gè)元素,即指向下一個(gè)元素,即 a1。(2) *p+, 相當(dāng)于相當(dāng)于 *(p+),先執(zhí)行,先執(zhí)行 * p,后執(zhí)行,后執(zhí)行 p+。(3) *p+ 和和 *(+p) 作用不同。作用不同。 *p+ 是取出是取出 a0 的值,后的值,后 p+; *(+p) 是先使是先使p 加加1,再取,再取*p,即,即 取出取出 a1 的值。的值。(4) (*p)+, 表示表示 p 所指向的元素值加所指向的元素值加 1,即,即 (a0)+

29、,如若,如若 a0=3,則,則 (a0)+的值為的值為 4。(5) 如果如果 p 指向指向 a 數(shù)組中第數(shù)組中第 i 個(gè)元素,則:個(gè)元素,則: *(p- -) 相當(dāng)于相當(dāng)于 ai- -,先對(duì),先對(duì) p進(jìn)行進(jìn)行 “ * ”運(yùn)算,再使運(yùn)算,再使 p- -。 *(+p) 相當(dāng)于相當(dāng)于 a+i,先使,先使 p+,再作,再作 “ * ” 運(yùn)算。運(yùn)算。 *(- -p) 相當(dāng)于相當(dāng)于 a- -i,先使,先使 p- -,再作,再作 “ * ” 運(yùn)算。運(yùn)算。注意:指針變量的運(yùn)算。若注意:指針變量的運(yùn)算。若 p=a ; 則則:一、一、 多維數(shù)組的地址多維數(shù)組的地址 例例. 二維數(shù)組二維數(shù)組 int a34=1,3

30、,5,7,9,11,13,15,17,19,21,23; 分析二維數(shù)組的性質(zhì):分析二維數(shù)組的性質(zhì): a 是一個(gè)數(shù)組名,包含是一個(gè)數(shù)組名,包含3個(gè)元素:個(gè)元素: a0,a1,a2。 每個(gè)元素又是一個(gè)一維數(shù)組,包含每個(gè)元素又是一個(gè)一維數(shù)組,包含4個(gè)元素。個(gè)元素。a0a1a2a 數(shù)組數(shù)組aa+1a+2(2008)(2000)(2016)7.3.4 指向多維數(shù)組的指針和指針變量指向多維數(shù)組的指針和指針變量a0a1 a2a2321191715131197531 從二維數(shù)組的角度看,從二維數(shù)組的角度看,a 代表代表整個(gè)二維數(shù)組的整個(gè)二維數(shù)組的首地址首地址,也就是,也就是第第0行的首地址行的首地址。若若a

31、的首地址為的首地址為2000,因?yàn)槊恳恍?,因?yàn)槊恳恍?個(gè)元素,占用個(gè)元素,占用8個(gè)字節(jié),所以則個(gè)字節(jié),所以則 a+1的首地址為的首地址為2008,a+2的首地的首地址為址為2016。故故a+1 代表第代表第1行的首地址,即行的首地址,即a1的地址;的地址;a+2 代表第代表第2行的首行的首地址,即地址,即a2的地址的地址。 由于由于a0 與與 *(a+0) 等價(jià),等價(jià),a1 與與 *(a+1) 等價(jià),等價(jià),ai 與與 *(a+i) 等價(jià)等價(jià),因,因此此ai+j 與與*(a+i)+j 等價(jià),它們都是元素等價(jià),它們都是元素aij 的地址的地址。故:元素故:元素aij 的地址的地址表示是表示是: a

32、i+j 或或 *(a+i)+j 而而 *(*(a+i)+j) 或或 *(ai+j) 是元素是元素 aij的值的值。2000 2002 2004 2006 1 3 5 72008 2010 2012 2014 9 11 13 152016 2018 2020 2022 17 19 21 23 a a0a1a2a0 a0+1 a0+2 a0+3 a0、a1、a2既然是一維數(shù)組名,則既然是一維數(shù)組名,則它們應(yīng)代表一維數(shù)組的首地址。它們應(yīng)代表一維數(shù)組的首地址。 a0代表代表第第0行行一維數(shù)組中一維數(shù)組中第第0列列元素元素的地址,即的地址,即&a00; a0+1代表代表第第0行第行第1列元素的地

33、址,即列元素的地址,即&a01 。a1代表代表第第1行行一維數(shù)組中一維數(shù)組中第第0列列元素元素的地址,即的地址,即&a10; 。a2代表代表第第2行行一維數(shù)組中一維數(shù)組中第第0列列元素元素的地址,即的地址,即&a20。表表 10.1表示形式表示形式含含 義義地地 址址二維數(shù)組名,數(shù)組首地址,二維數(shù)組名,數(shù)組首地址,0行首地址行首地址 2000 第第 0 行第行第 0 列元素地址列元素地址 2000第第 1 行首地址行首地址 2008第第 1 行第行第 0 列元素地址列元素地址 2008第第 1 行第行第 2 列元素地址列元素地址 2012 第第 1 行第行第 2 列元素

34、的值列元素的值 元素值為元素值為 13aa0+0 , *(a+0) , *aa+1 , &a10a1+0 , *(a+1)a1+2 , *(a+1)+2 , &a12*(a1+2),*(*(a+1)+2),a12aa+1a+22022232020212018192016172014152012132010112008920067200452002320001a0+3a0+2a0+1a0+0牢記牢記: 二維數(shù)組名(如二維數(shù)組名(如 a)是指向)是指向行行的的,因此因此a+1中的中的“1” 表示表示一行元素一行元素。 一維數(shù)一維數(shù)組名(如組名(如a0、a1)是指向)是指向列列的,的

35、,a0+1 中的中的 “1” 代表一個(gè)元素。代表一個(gè)元素。 在在行行指針前面加一個(gè)指針前面加一個(gè)*,就,就轉(zhuǎn)換為列轉(zhuǎn)換為列指指針。如針。如 a、a+1(行)(行) *a、*(a+1)(列)(列)在在列列指針前面加一個(gè)指針前面加一個(gè)&,就轉(zhuǎn)換為行指針,就轉(zhuǎn)換為行指針.如如 a0(列)(列) &a0(行,等價(jià)于(行,等價(jià)于&*a,即與即與a 等價(jià))等價(jià))例例 7.11 輸出二維數(shù)組有關(guān)的值。輸出二維數(shù)組有關(guān)的值。#define FORMAT %d,%dn”main( ) int a34 =1,3,5,7,9,11,13,15,17,19,21,23; printf(FORM

36、AT, a , *a) ;1 printf(FORMAT, a0 , *(a+0) ;2 printf(FORMAT, &a0 , &a00) ;3 printf(FORMAT, a1 , a+1) ;4 printf(FORMAT, &a10 , *(a+1)+0) ;5 printf(FORMAT, a2 , *(a+2) ;6 printf(FORMAT, &a2 , a+2) ;7 printf(FORMAT, a10 , *(*(a+1)+0) );8(假設(shè)系統(tǒng)給數(shù)組(假設(shè)系統(tǒng)給數(shù)組 a 分分配的首地址為配的首地址為 2000)則運(yùn)行結(jié)果是:則運(yùn)行結(jié)果

37、是:注意:注意:1.a 是二維數(shù)組名,代表數(shù)組首地址,不能企圖用是二維數(shù)組名,代表數(shù)組首地址,不能企圖用*a來(lái)得到來(lái)得到a00的值。的值。2.*a 相當(dāng)于相當(dāng)于*(a+0) ,即,即a0,它是第,它是第0行地址。行地址。3.a是行指針,是行指針,*a是列指針,指向是列指針,指向0行行0列元素。列元素。*a是是0行行0列元素的值。列元素的值。4.a+1指向第一行首地址,不能企圖用指向第一行首地址,不能企圖用*(a+1)得到得到a10的值,而應(yīng)該用的值,而應(yīng)該用*(a+1) 求求a10元素的值。元素的值。2000, 20002000, 20002000, 20002008, 20082008, 2

38、0082016, 20162016, 20169, 9例例 7.12 用指針變量輸出數(shù)組元素的值。用指針變量輸出數(shù)組元素的值。main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23 ; int *p ; for(p=a0 ; pa0+12 ; p+) printf(%4d , *p) ; 運(yùn)運(yùn)行結(jié)果:行結(jié)果: 1 3 5 7 9 11 13 1517 19 21 23p-a0:為相距的單:為相距的單元個(gè)數(shù),不是字節(jié)數(shù)元個(gè)數(shù),不是字節(jié)數(shù)若:若: a0 2000 p 2008則:則: p-a0 = 4 1. 指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量二、指向

39、多維數(shù)組的指針變量二、指向多維數(shù)組的指針變量2123191711131597531pa if(p-a0)%4 = = 0) printf(n) ;數(shù)組元素在數(shù)組中的位置數(shù)組元素在數(shù)組中的位置:計(jì)算某個(gè)指定的數(shù)組元素在數(shù)計(jì)算某個(gè)指定的數(shù)組元素在數(shù)組中的位置(即相對(duì)于數(shù)組起始位置組中的位置(即相對(duì)于數(shù)組起始位置的的相對(duì)位移量相對(duì)位移量):): 設(shè)設(shè)a是大小為是大小為 nm 的二維數(shù)組,則的二維數(shù)組,則 元素元素 aij 在在數(shù)組中的數(shù)組中的相對(duì)位置相對(duì)位置的計(jì)算公式為:的計(jì)算公式為: i*m+j 若若 p 是一個(gè)指針變量,指向二是一個(gè)指針變量,指向二維數(shù)組維數(shù)組 a 的首地址:的首地址: p=&a

40、mp;a00 或或 p=a0,則,則 元素元素 aij 的地址為的地址為 p+i*m+j,故故 aij 可以表示成:可以表示成:*(p+i*m+j) 。如如 a12位置是:位置是: 1*4+2如如 a12地址是:地址是: p+ 1*4+2則則 a12的的值是值是: *(p+1*4+2)a12mna,p以前的例子都是輸出數(shù)組全部元素,若是輸出某個(gè)指定的數(shù)組元以前的例子都是輸出數(shù)組全部元素,若是輸出某個(gè)指定的數(shù)組元素該怎么辦呢?素該怎么辦呢?應(yīng)該事先計(jì)算出該元素在數(shù)組中的位置。應(yīng)該事先計(jì)算出該元素在數(shù)組中的位置。2. 指向由指向由m個(gè)整數(shù)組成的一維數(shù)組的指針變量個(gè)整數(shù)組成的一維數(shù)組的指針變量數(shù)組指

41、針數(shù)組指針由于由于 * 運(yùn)算符的級(jí)別低于運(yùn)算符的級(jí)別低于 ,為了定義指,為了定義指針變量針變量 p,就必須表示成,就必須表示成 (*p) 的形式。的形式。定義一個(gè)定義一個(gè)數(shù)組指針數(shù)組指針變量變量 p , 指向包含指向包含 4 個(gè)元素的一維數(shù)組。個(gè)元素的一維數(shù)組。 定義方法:定義方法: int (*p)4;a0a1a2a 數(shù)組數(shù)組pp+1p+2*p 有有 4 個(gè)整型元素,即個(gè)整型元素,即 指針指針 p 指向含有指向含有 4 個(gè)整型元素的一維個(gè)整型元素的一維數(shù)組數(shù)組, p 的值就是該一維數(shù)組的首地址,的值就是該一維數(shù)組的首地址,p是數(shù)組指針。是數(shù)組指針。(*p)3(*p)2(*p)1(*p)0p*

42、p(數(shù)組)(數(shù)組)若定義:若定義:int a34;p=&a0; /*p指向指向 a0*/則則p+1 不是指向不是指向a01,而是,而是a1,p的增值以一維數(shù)組的長(zhǎng)度為單位。的增值以一維數(shù)組的長(zhǎng)度為單位。故故aij可表示為:可表示為:*(*(p+i)+j)。例例 7.13 輸出二維數(shù)組任一行任一列元素的值。輸出二維數(shù)組任一行任一列元素的值。main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23 ; int (*p)4 , i , j ; p=a ; scanf(%d,%d ,&i , &j) ; printf(a%d%d=%dn ,

43、i , j , *(*(p+i)+j) ;pp+21 3 5 79 11 13 1517 19 21 23運(yùn)行結(jié)果:運(yùn)行結(jié)果: 輸入:輸入: 1, 2 輸出:輸出: a12=13說(shuō)明:說(shuō)明:1.aij 的地址的地址可以表示為可以表示為: *(p+i) + j 。注意注意*(p+i) + j 不能寫成不能寫成 p+ i+j。2.對(duì)于對(duì)于數(shù)組指針數(shù)組指針p, p=a; 則則p 指向二維數(shù)指向二維數(shù)組組 a 的第一行首地址的第一行首地址 。3.對(duì)于對(duì)于指針變量指針變量 p,p=a0;則則 p 指向二維指向二維數(shù)組數(shù)組 a 的第一行第一列元素首地址,的第一行第一列元素首地址, 而而 p=a ; 是不合

44、法是不合法 的。的。void average(float *p, int n) float *p_end; float sum=0 , aver; p_end=p+n-1; for( ; p=p_end; p+ ) sum=sum + (*p); aver=sum/n; printf(average=%6.2n,aver);void search( float (*p)4 , int n) int j ; printf(the score of No. %d are:n, n); for (j=0 ; j4 ; j+) printf(%5.2f , *(*(p+n)+j) );由于由于 p 指

45、向一維數(shù)組,因此,指向一維數(shù)組,因此,*(p+n) 是第是第 n 行的首地行的首地址,址, *(p+n)+j 是是 第第 n 行第行第 j 列元素的地址。列元素的地址。 運(yùn)行結(jié)果:運(yùn)行結(jié)果: average=82.25 the score of No.2 are: 90.00 99.00 100.00 98.00最后一個(gè)元素的地址最后一個(gè)元素的地址從指向第一個(gè)元素起從指向第一個(gè)元素起,依次指向下一個(gè)元素依次指向下一個(gè)元素例例 7.15 在上例中,找出有一門以上不及袼的學(xué)生,輸出其全部成績(jī)。在上例中,找出有一門以上不及袼的學(xué)生,輸出其全部成績(jī)。void search( float (*p)4 ,

46、 int n) int i , j , flag; for(j=0 ; jn ; j+) flag=0 ; for (i=0 ; i4 ; i+) if(*(*(p+j)+i)60) flag=1 ; if(flag= = 1) printf(No. %d fails , his scores are :n , j+1); for(i=0 ; iy?x:y);調(diào)用調(diào)用 p 所指向的函數(shù)所指向的函數(shù)7.7.1 指針數(shù)組指針數(shù)組 指針數(shù)組指針數(shù)組 數(shù)組元素均為指針類型數(shù)據(jù),數(shù)組元素均為指針類型數(shù)據(jù), 即每個(gè)元素都是指針變量。即每個(gè)元素都是指針變量。 指針數(shù)組的定義形式指針數(shù)組的定義形式: 類型標(biāo)識(shí)

47、類型標(biāo)識(shí) *數(shù)組名數(shù)組名 數(shù)組長(zhǎng)度數(shù)組長(zhǎng)度例如:例如: int *p4例如:例如: 若干個(gè)字符串的排序和查找。若干個(gè)字符串的排序和查找。由于字符串本身就是一個(gè)字符數(shù)組,而各個(gè)字符串的長(zhǎng)度又不同,因此由于字符串本身就是一個(gè)字符數(shù)組,而各個(gè)字符串的長(zhǎng)度又不同,因此用二維數(shù)組處理不太方便。用二維數(shù)組處理不太方便。如果用指針數(shù)組,使各元素分別指向各個(gè)字符串,那么只要改變指針數(shù)如果用指針數(shù)組,使各元素分別指向各個(gè)字符串,那么只要改變指針數(shù)組中各元素的指向,就可對(duì)所指的字符串進(jìn)行排序。組中各元素的指向,就可對(duì)所指的字符串進(jìn)行排序。注意與注意與 int (*p)4 的區(qū)別的區(qū)別!7.7 指針數(shù)組和指向指針的

48、指針指針數(shù)組和指向指針的指針由于由于 的優(yōu)先級(jí)高于的優(yōu)先級(jí)高于* , p 先與先與 結(jié)合表示結(jié)合表示數(shù)組,然后數(shù)組,然后 p 再與再與 * 結(jié)合,表示數(shù)組是指針類結(jié)合,表示數(shù)組是指針類型,型,int 表示每個(gè)數(shù)組元素指向一個(gè)整型變量表示每個(gè)數(shù)組元素指向一個(gè)整型變量.例如:有若干字符串,例如:有若干字符串,長(zhǎng)短不一長(zhǎng)短不一 Follow me BASIC Great Wall FORTRAN Computer designF o l l o w m e 0B A S I C 0G r e a t w a l l 0F O R T R A N 0C o m p u t e r d e s i g

49、n 0 Follow me BASIC Great WallFORTRANComputer design name0 name1 name2 name3 name4指針數(shù)組指針數(shù)組 name5字符串字符串可以分別定義一些字符串,然后用指針數(shù)組中的元素分別指向各字符串。如果想可以分別定義一些字符串,然后用指針數(shù)組中的元素分別指向各字符串。如果想對(duì)字符串排序,不必改動(dòng)字符串的位置,只需改動(dòng)指針數(shù)組中各元素的指向。這對(duì)字符串排序,不必改動(dòng)字符串的位置,只需改動(dòng)指針數(shù)組中各元素的指向。這樣,各字符串的長(zhǎng)度可以不同,且移動(dòng)指針要比移動(dòng)字符串所花的時(shí)間少得多。樣,各字符串的長(zhǎng)度可以不同,且移動(dòng)指針要比移動(dòng)

50、字符串所花的時(shí)間少得多。void print(char *name , int n) int i; for(i=0 ; in ; i+) printf(%sn, namei) ;#include main( ) void sort(char *name , int n ); void print(char *name , int n); char *name =Follow me, BASIC, Great Wall, FORTRAN, Computer design; int n=5; /* 字符串個(gè)數(shù)字符串個(gè)數(shù) */ sort(name , n) ; print(name ,n) ;voi

51、d sort(char *name , int n) char *temp; int i , j , k ; for(i=0 ; in-1 ; i+) k=i; for (j=i+1 ; j0) k=j; if (k != i) temp=namei; namei=namek; namek=temp; 例例7.27 將將n 個(gè)字符串按字母順序(由小到大)排序輸出個(gè)字符串按字母順序(由小到大)排序輸出( 設(shè)設(shè) n=5 )運(yùn)行結(jié)果:運(yùn)行結(jié)果:BASICComputer designFORTRANFollow meGreat Wall name0 Follow me name1 BASIC name

52、2 Great Wall name3 FORTRAN name4 Computer design定義形式定義形式: 類型標(biāo)識(shí)類型標(biāo)識(shí) * 變量名變量名例如例如: char *p由于由于*是從右到左結(jié)合,因此是從右到左結(jié)合,因此 *p 相當(dāng)于相當(dāng)于 *(*p)表示表示 p 是指針變量是指針變量表示指針變量表示指針變量 p 指向的還是一個(gè)指針,指向的還是一個(gè)指針,即即: *p 也是指針變量也是指針變量表示指針變量表示指針變量 p 指向一個(gè)字符型指針變量指向一個(gè)字符型指針變量char *(*p) &*p &ch Bp *p ch* * p得到字符得到字符 B7.7.2 指向指針的指針

53、指向指針的指針例如:例如:char *name5;char *p ;p=name +2;printf(%on, *p) ;printf(%sn , *p) ;例例 7.28 使用指向指針的指針使用指向指針的指針main( ) char *name =Follow me, BASIC, Great Wall, FORTRAN, Computer design ; char *p ; int j ; p=name ; for(j=0 ; j5 ; j+)printf(%sn , *(p+j) ; 以以%o 輸出輸出name2的值的值(地址地址)以以%s 輸出輸出name2的字符串的字符串Great

54、 Wall運(yùn)行結(jié)果:運(yùn)行結(jié)果:Follow meBASICFORTRANGreat WallComputer designmain( ) int a5=1,3,5,7,9 ; int *num5=&a0 , &a1 , &a2 , &a3 , &a4 ; int *p , j ; p=num ; for(j=0 ; j5 ; j+) printf(%dt , *p) ;p+ ; 例例 7.29運(yùn)行結(jié)果:運(yùn)行結(jié)果:13579地址地址 值值 值值地址地址1地址地址2值值地址地址1地址地址2地址地址3地址地址n值值。指針變量指針變量1 指針變量指針變量2 指針

55、變量指針變量3 指針變量指針變量 n 變量變量單級(jí)間址二級(jí)間址多級(jí)間址7.8.1 指針類型的小結(jié)指針類型的小結(jié)7.8 指針類型和指針運(yùn)算的小結(jié)指針類型和指針運(yùn)算的小結(jié)定定 義義含含 義義int i;定義整型變量定義整型變量 iint *p;p為指向整型數(shù)據(jù)的指針變量為指向整型數(shù)據(jù)的指針變量int an定義整型數(shù)組定義整型數(shù)組 a ,它有,它有n 個(gè)整型元素個(gè)整型元素int *pn;定義指針數(shù)組定義指針數(shù)組 p ,它有,它有 n 個(gè)指向整型數(shù)據(jù)的指針元素組個(gè)指向整型數(shù)據(jù)的指針元素組成成int (*p)n p 為指向含為指向含 n 個(gè)元素的一維數(shù)組的指針變量個(gè)元素的一維數(shù)組的指針變量int f(

56、);f 為帶回整型函數(shù)值的函數(shù)為帶回整型函數(shù)值的函數(shù)int *p( );p為帶回一個(gè)指向整型數(shù)據(jù)的指針的函數(shù),為帶回一個(gè)指向整型數(shù)據(jù)的指針的函數(shù),int (*p)( ); p為指向函數(shù)的指針,該函數(shù)返回一個(gè)整型數(shù)據(jù)為指向函數(shù)的指針,該函數(shù)返回一個(gè)整型數(shù)據(jù)int *p;p是一個(gè)指針變量,它指向一個(gè)指向整型數(shù)據(jù)的指針變量是一個(gè)指針變量,它指向一個(gè)指向整型數(shù)據(jù)的指針變量指針運(yùn)算有如下幾種:指針運(yùn)算有如下幾種:1. 指針變量指針變量 可以和整數(shù)進(jìn)行加(減),例如:可以和整數(shù)進(jìn)行加(減),例如:p+ , p- - , p+i , p-i , p+=i , p-=i ;注意:注意:p+ 1 指的是加指的是

57、加 1 個(gè)單位,即個(gè)單位,即 p 所指向的變量占用的內(nèi)存字節(jié)數(shù),所指向的變量占用的內(nèi)存字節(jié)數(shù),如如 p是指向是指向整型變量的指針,則加整型變量的指針,則加 2個(gè)字節(jié)。個(gè)字節(jié)。2. 指針變量可以賦值(指針變量可以賦值(賦地址賦地址),例如:),例如:p=&a ; p=array ; (array是數(shù)組名是數(shù)組名) 或或 p=&array3 ; p=max ; (max是函數(shù)名)是函數(shù)名) p1=p2 ; (p2是指向某個(gè)變量的指針,賦給指針變量是指向某個(gè)變量的指針,賦給指針變量p1) p=1000; 是不允許的。是不允許的。3. 指針變量可以賦空值,即不指向任何變量。例如:指針變

58、量可以賦空值,即不指向任何變量。例如: p=NULL ; ( NULL 表示整數(shù)表示整數(shù) 0 ),在),在 stdio.h 中有定義:中有定義:#define NULL 0 任何指針變量或地址都可以與任何指針變量或地址都可以與NULL作相等或不相等的比較,如作相等或不相等的比較,如 if(p=NULL) 4. 兩個(gè)指針變量可以相減,即兩個(gè)指針變量可以相減,即 p2 - p1 ,表示兩個(gè)指針之間的元素個(gè)數(shù)。,表示兩個(gè)指針之間的元素個(gè)數(shù)。但但p1+p2 無(wú)意義。無(wú)意義。5. 若兩個(gè)指針指向同一個(gè)數(shù)組的元素,則可以進(jìn)行比較,若兩個(gè)指針指向同一個(gè)數(shù)組的元素,則可以進(jìn)行比較,例如:例如: p1p2 ,

59、p1=p2 .p1p27.8.2 指針運(yùn)算小結(jié)指針運(yùn)算小結(jié)它可以用來(lái)表示指向一個(gè)抽象的數(shù)據(jù)類型它可以用來(lái)表示指向一個(gè)抽象的數(shù)據(jù)類型。例如:。例如:char *p1 ;void *p2 ;p1=(char *) p2 ; 把把 p2 強(qiáng)制轉(zhuǎn)換為指向字符變量的指針。強(qiáng)制轉(zhuǎn)換為指向字符變量的指針。也可以將一個(gè)函數(shù)定義為也可以將一個(gè)函數(shù)定義為 (void *)類型,例如:類型,例如:void *fun(char ch1 , char ch2)指針是指針是C語(yǔ)言中重要的概念。使用指針的優(yōu)點(diǎn)是:語(yǔ)言中重要的概念。使用指針的優(yōu)點(diǎn)是:(1) 提高效率提高效率 ;(2) 被調(diào)函數(shù)可以改變主調(diào)函數(shù)的值,即可以返回

60、多個(gè)值;被調(diào)函數(shù)可以改變主調(diào)函數(shù)的值,即可以返回多個(gè)值;(3) 可以實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ)分配。可以實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ)分配。7.8.3 void 指針類型指針類型1. 指針變量如何定義,指針和地址的關(guān)系,如何對(duì)指針進(jìn)指針變量如何定義,指針和地址的關(guān)系,如何對(duì)指針進(jìn)行運(yùn)算?行運(yùn)算?2. 如何定義和使用以下對(duì)象:指針數(shù)組、數(shù)組指針、指針如何定義和使用以下對(duì)象:指針數(shù)組、數(shù)組指針、指針的指針、函數(shù)指針、返回值為指針的函數(shù)。的指針、函數(shù)指針、返回值為指針的函數(shù)。3. 如何使用字符指針?如何使用字符指針?4. 如何通過(guò)指針來(lái)改變函數(shù)實(shí)在參數(shù)的值?如何通過(guò)指針來(lái)改變函數(shù)實(shí)在參數(shù)的值?5. 什么是命令行參數(shù)?如何正確使用?什么是命令行參數(shù)?如何正確使用?本本 章章 要要 點(diǎn)點(diǎn) 習(xí)習(xí) 題題 十十 (一)(一)(一)填空(一)填空 (1) 寫出建立圖一所示的存儲(chǔ)結(jié)構(gòu)所需的定義語(yǔ)句:寫出建立圖一所示的存儲(chǔ)結(jié)構(gòu)所需的定義語(yǔ)句: char_. (2) 寫出寫出圖一所示的存儲(chǔ)結(jié)構(gòu)所需的賦值語(yǔ)句:圖一所示的存儲(chǔ)結(jié)構(gòu)所需的賦值語(yǔ)句: _=B ; p=_. (3) 寫出用指針變量寫出用指針變量 p 輸出字符變量的語(yǔ)句:輸出字符變量的語(yǔ)句:printf(%cn ,);(二)填空(二)填空 (1) 寫出建立圖二所示的存儲(chǔ)結(jié)構(gòu)所需的定義語(yǔ)句:寫出建立圖二所示的存儲(chǔ)結(jié)構(gòu)所需的定義語(yǔ)句: int _ , _ ; (2) 寫出寫出圖二所示

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論