C語(yǔ)言程序設(shè)計(jì)教程ppt課件_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程ppt課件_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程ppt課件_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程ppt課件_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩68頁(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、第8章 指針第8章 指針2. 變量的三要素:名字、類型與值 每個(gè)變量都經(jīng)過(guò)變量名與相應(yīng)的存儲(chǔ)單元相連系,詳細(xì)分配哪些單元給變量,由編譯系統(tǒng)完成變量名到對(duì)應(yīng)內(nèi)存單元地址的變換。 變量分配存儲(chǔ)空間的大小由類型決議。 變量的值那么是指相應(yīng)存儲(chǔ)單元的內(nèi)容。 3.內(nèi)存存取方式 直接存取:把直接按變量名或地址存取變量值的方式稱為 “直接存取方式。 間接存取:經(jīng)過(guò)定義一種特殊的變量專門(mén)存放內(nèi)存或變量的地址,然后根據(jù)該地址值再去訪問(wèn)相應(yīng)的存儲(chǔ)單元 。第8章 指針系統(tǒng)為特殊變量p用來(lái)存放地址的分配的存儲(chǔ)空間地址是4800,p中保管的是變量a的地址,即4000,當(dāng)要讀取a變量的值12345時(shí),不是直接經(jīng)過(guò)a變量,

2、也不是直接經(jīng)過(guò)保管12345的內(nèi)存單元的地址4000去取值,而是先經(jīng)過(guò)變量p得到p的值4000,即a的地址,再根據(jù)地址4000讀取它所指向單元的值12345。 這種間接的經(jīng)過(guò)變量p得到變量a的地址,再存取變量a的值的方式即為“間接存取。 通常稱變量p指向變量a,變量a是變量p所指向的對(duì)象400012345400040024800pap(4800) p(4800) a(4000) 4000123454000間接存取表示圖第8章 指針4.指針的概念 在言語(yǔ)中,用指針來(lái)表示一個(gè)變量指向另一個(gè)變量這樣的指向關(guān)系。 所謂指針即地址。 一個(gè)變量的指針即該變量的地址,如4000就是指向變量a的指針。 指針變

3、量:專門(mén)存放地址的變量,如p即是一個(gè)指針變量,它存放的是a的地址4000。第8章 指針8.1.2 指針變量的定義與初始化指針變量的定義與初始化1. 指針變量的定義指針變量的定義 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 *指針變量名;指針變量名;例:例:float *p1; (定義定義p1為指向?qū)嵭妥兞康闹羔樧兞繛橹赶驅(qū)嵭妥兞康闹羔樧兞? char *p2; (定義定義p2為指向字符型變量的指針變量為指向字符型變量的指針變量)在指針變量定義中,在指針變量定義中,*是一個(gè)闡明符,它闡明其后的變是一個(gè)闡明符,它闡明其后的變量是指針變量,如量是指針變量,如p是指針變量是指針變量,而不要以為而不要以為“*p是是指針變量。

4、指針變量。指針變量定義時(shí)指定的數(shù)據(jù)類型不是指針變量本身指針變量定義時(shí)指定的數(shù)據(jù)類型不是指針變量本身變量存放的值的數(shù)據(jù)類型,而是指針變量所指變量存放的值的數(shù)據(jù)類型,而是指針變量所指向的對(duì)象或稱目的的數(shù)據(jù)類型向的對(duì)象或稱目的的數(shù)據(jù)類型 指針變量存放的是所指向的某個(gè)變量的地址值,而普指針變量存放的是所指向的某個(gè)變量的地址值,而普通變量保管的是該變量本身的值通變量保管的是該變量本身的值 指針變量并不固定指向一個(gè)變量,可指向同類型的不指針變量并不固定指向一個(gè)變量,可指向同類型的不同變量同變量第8章 指針(1) 指針運(yùn)算符與地址運(yùn)算符指針運(yùn)算符與地址運(yùn)算符 與指針援用有關(guān)的兩個(gè)運(yùn)算符:與指針援用有關(guān)的兩個(gè)

5、運(yùn)算符:&與與*。 &:取地址運(yùn)算符取地址運(yùn)算符 *:指針運(yùn)算符,或稱指向運(yùn)算符、間接訪問(wèn)運(yùn)算:指針運(yùn)算符,或稱指向運(yùn)算符、間接訪問(wèn)運(yùn)算 符。符。指針指向的對(duì)象的表示方式指針指向的對(duì)象的表示方式: *指針變量指針變量此處此處*是訪問(wèn)指針?biāo)笇?duì)象的運(yùn)算符是訪問(wèn)指針?biāo)笇?duì)象的運(yùn)算符,與指針定義時(shí)的與指針定義時(shí)的*不同。不同。2. 指針變量初始化 第8章 指針(2) 指針變量初始化假設(shè)有定義: int a,*p;語(yǔ)句僅僅定義了指針變量p,但指針變量并未指向確定的變量(或內(nèi)存單元)。由于這些指針變量還沒(méi)有賦給確定的地址值,只需將某一詳細(xì)變量的地址賦給指針變量之后,指針變量才指向確定的變

6、量?jī)?nèi)存單元。指針變量初始化:在定義指針時(shí)同時(shí)給指針一個(gè)初始值如: int a,*pa=&a;40003a(4000)pa*pa第8章 指針(3) 指針變量的援用 *指針變量名代表所指變量的值。 指針變量名代表所指變量的地址。有定義: int a,*p=&a;用*p來(lái)表示p指向的對(duì)象a,*p與a是等價(jià)的。 *p可以象普通變量一樣運(yùn)用。 例如: a=12; *p=12; scanf(%d,&*p); scanf(%d,p); printf(“%d%d,*p,a);留意:*與&具有一樣的優(yōu)先級(jí),結(jié)合方向從右到左。這樣,&*p即&(*p),是對(duì)變量*p取

7、地址,它與&a等價(jià);p與&(*p)等價(jià),a與*(&a)等價(jià)。 由于p本身就是指針,其內(nèi)容就是a的地址,假設(shè)寫(xiě)成“%d,&p是錯(cuò)的。第8章 指針8.1.3 指針運(yùn)算1. 1. 指針的賦值運(yùn)算指針的賦值運(yùn)算1 1將變量地址值賦給指針變量,使指針指向該將變量地址值賦給指針變量,使指針指向該變量。變量。設(shè)有如下定義:設(shè)有如下定義: int a,b, int a,b,* *pa,pa,* *pb;pb; float float * *pf;pf;第一行定義了整型變量第一行定義了整型變量a,ba,b及指針變量及指針變量pa,pbpa,pb。papa、pbpb還沒(méi)有被賦值,因

8、此還沒(méi)有被賦值,因此papa、pbpb沒(méi)有指向任何變量沒(méi)有指向任何變量, , 下面語(yǔ)句完成對(duì)下面語(yǔ)句完成對(duì)pa,pbpa,pb的賦值:的賦值: pa=&a; pa=&a; pb=&b; pb=&b;第8章 指針例如:int j,k; int *pointer1,*pointer2; pointer1=&j;pointer2=&k; pointer1jpointer2k第8章 指針(2) 一樣類型的指針變量間的賦值一樣類型的指針變量間的賦值 pa與pb都是整型指針變量,它們間可以相互賦值,如:pb=pa; 即 pa,pb都指向變量a,此時(shí)a、*pa

9、、*pb是等價(jià)的。指針指向變化如以下圖:留意:只需一樣類型的指針變量才干相互賦值,如留意:只需一樣類型的指針變量才干相互賦值,如pf=pa;是不允許的。由于是不允許的。由于pa是整型指針是整型指針,pf是浮點(diǎn)型指針。是浮點(diǎn)型指針。&a&bpapba,*pab,*pb&a&apapba,*pa,*pbb第8章 指針給指針變量賦空值給指針變量賦空值 給指針變量賦空值,闡明該指針不指向任何變量。 “空指針值用NULL表示,NULL是在頭文件stdio.h中預(yù)定義的常量,其值為,在運(yùn)用時(shí)應(yīng)加上預(yù)定義行,如: #include stdio.h int *pa=NULL;

10、亦可以用下面的語(yǔ)句給指針賦“空值: pa=0; 或: pa=0; 這里指針pa并非指向0地址單元,而是具有一個(gè)確定的“空值,表示pa不指向任何變量。留意:指針雖然可以賦值0,但卻不能把其它的常量地址直接賦給指針。例如: pa=4000; 是非法的。第8章 指針例 8.1 指針定義與初始化main()int a,b;int *pointer_1,*pointer_2;a=100;b=10;pointer_1=&a; pointer_2=&b; printf (%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2); 第8章 指針程序運(yùn)轉(zhuǎn)結(jié)

11、果:100,10100,10&a&bbPointer_1Pointer_2a*pointer_1*pointer_2第8章 指針例8.2 從鍵盤(pán)上輸入兩個(gè)整數(shù)到a、b,按由大到小輸出。#include main( ) int a,b,*pa=&a,*pb=&b,*p;/*定義指針變量pa、pb,如下頁(yè)圖a*/ scanf(%d%d,&a,&b); if (*pa*pb) p=pa; /*進(jìn)展指針交換,如下頁(yè)圖b,c*/ pa=pb; pb=p; printf(n a=%d,b=%dn,a,b); printf(n max=%d,min=%d,*p

12、a,*pb); /* pa指向大數(shù),pb指向小數(shù)*/第8章 指針假設(shè)輸入: 12 22輸出結(jié)果: a=12,b=22 max=22,min=12 (b) (c)指針變化表示圖1222ppapb1222ppapbpapbab第8章 指針2. 2. 指針的算術(shù)運(yùn)算指針的算術(shù)運(yùn)算 (1) 加減運(yùn)算: 一個(gè)指針可以加、減一個(gè)整數(shù)n,其結(jié)果與指針?biāo)笇?duì)象的數(shù)據(jù)類型有關(guān)。指針變量的值應(yīng)添加或減少“nsizeof(指針類型)。 加減運(yùn)算常用于數(shù)組的處置。對(duì)指向普通數(shù)據(jù)的指針,加減運(yùn)算無(wú)實(shí)踐意義。例如: int a10,*p=a,*x; x=p+3; /*實(shí)踐上是p加上3*2個(gè)字節(jié)賦給x, x指向數(shù)組的第三個(gè)

13、分量*/ 對(duì)于不同基類型的指針,指針變量“加上或“減去一個(gè)整數(shù)n所挪動(dòng)的字節(jié)數(shù)是不同的。例如: float a10, *p=a, *x; p=p+3; /*實(shí)踐上是p加上3*4個(gè)字節(jié)賦給x, x依然指向數(shù)組的第三個(gè)分量*/ 第8章 指針 (2) 自增自減運(yùn)算指針變量自增、自減運(yùn)算具有上述運(yùn)算的特點(diǎn),但有前置后置、先用后用的思索,務(wù)請(qǐng)小心。 例如: int a10, *p=a, *x; x=p+; /* x第一個(gè)元素分量, p指向第二個(gè)元素*/ x=+p; /* x、 p均指向數(shù)組的第二個(gè)分量*/* p+相當(dāng)于*p+ +。*p+與*p+ 含義不同,前者表示地址自增,后者表示當(dāng)前所指向的數(shù)據(jù)自增。

14、 第8章 指針2. *&a的含意是什么? (答:a )3. (*p)+相當(dāng)于什么? (答:a+ )思索:1.假設(shè)有定義 int a,*p; 執(zhí)行了“p=&a,那么: “&*p的含意是什么?(答:相當(dāng)于&a )第8章 指針 3. 3.指針的關(guān)系運(yùn)算指針的關(guān)系運(yùn)算 與根本類型變量一樣,指針可以進(jìn)展關(guān)系運(yùn)算。與根本類型變量一樣,指針可以進(jìn)展關(guān)系運(yùn)算。在關(guān)系表達(dá)式中允許對(duì)兩個(gè)指針進(jìn)展一切的關(guān)系運(yùn)算。假設(shè)在關(guān)系表達(dá)式中允許對(duì)兩個(gè)指針進(jìn)展一切的關(guān)系運(yùn)算。假設(shè)p,q是兩個(gè)同類型的指針變量,那么:是兩個(gè)同類型的指針變量,那么:pq,p=q都是允許的。都是允許的。 指針的關(guān)系運(yùn)算

15、在指向數(shù)組的指針中廣泛的運(yùn)用,假設(shè)指針的關(guān)系運(yùn)算在指向數(shù)組的指針中廣泛的運(yùn)用,假設(shè) p、q是指向同一數(shù)組的兩個(gè)指針,執(zhí)行是指向同一數(shù)組的兩個(gè)指針,執(zhí)行pq的運(yùn)算,其含義為,的運(yùn)算,其含義為,假設(shè)表達(dá)式結(jié)果為真非值,那么闡明假設(shè)表達(dá)式結(jié)果為真非值,那么闡明p所指元素在所指元素在q所指所指元素之后?;蛘哒f(shuō)元素之后。或者說(shuō)q所指元素離數(shù)組第一個(gè)元素更近些。所指元素離數(shù)組第一個(gè)元素更近些。 留意:在指針進(jìn)展關(guān)系運(yùn)算之前,指針必需指向確定的變量留意:在指針進(jìn)展關(guān)系運(yùn)算之前,指針必需指向確定的變量或存儲(chǔ)區(qū)域,即指針有初始值;另外,只需一樣類型的指針才或存儲(chǔ)區(qū)域,即指針有初始值;另外,只需一樣類型的指針才干

16、進(jìn)展比較。干進(jìn)展比較。 第8章 指針8.1.4 8.1.4 多級(jí)指針多級(jí)指針 把指向指針型數(shù)據(jù)的指針變量稱為指向指針的指針,或稱多級(jí)指針。二級(jí)指針的定義方式如下: 數(shù)據(jù)類型 *指針變量例如: int a,*p,*pp; a=22; p=&a; pp=&p;假設(shè)變量a的地址為4000,指針p的地址為4100,二級(jí)指針pp的地址為4800。a、p、pp三者的關(guān)系如上圖。&p=4100&a=400022pp(4800) p(4100) a(4000)第8章 指針8.2 指針與函數(shù)8.2.1 8.2.1 指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù) 利用指針作函數(shù)參數(shù),可以實(shí)現(xiàn)函數(shù)

17、利用指針作函數(shù)參數(shù),可以實(shí)現(xiàn)函數(shù)之間多個(gè)數(shù)據(jù)的傳送,當(dāng)形參為指針變量時(shí),之間多個(gè)數(shù)據(jù)的傳送,當(dāng)形參為指針變量時(shí),其對(duì)應(yīng)實(shí)參可以是指針變量或存儲(chǔ)單元地址。其對(duì)應(yīng)實(shí)參可以是指針變量或存儲(chǔ)單元地址。 函數(shù)形參為指針變量,用指針變量或變函數(shù)形參為指針變量,用指針變量或變量地址作實(shí)參量地址作實(shí)參例例8.3 8.3 編寫(xiě)一個(gè)交換兩個(gè)變量的函數(shù),在主編寫(xiě)一個(gè)交換兩個(gè)變量的函數(shù),在主程序中程序中 調(diào)用,實(shí)現(xiàn)兩個(gè)變量值的交換。調(diào)用,實(shí)現(xiàn)兩個(gè)變量值的交換。第8章 指針程序如下:#includemain() int a,b; int *pa,*pb; void swap(int *p1,int *p2); /*函數(shù)

18、聲明函數(shù)聲明*/ scanf(%d%d,&a,&b); pa=&a; /* pa指向變量指向變量a */ pb=&b; /* pb指向變量指向變量b */ swap(pa,pb); printf(na=%d,b=%dn,a,b);或:swap(&a,&b);第8章 指針接上頁(yè):void swap(int *p1,int *p2)int temp; temp=*p1; /*交換指針交換指針p1、p2所指向的變量的值所指向的變量的值*/ *p1=*p2; *p2=temp; 程序運(yùn)轉(zhuǎn)結(jié)果如下:程序運(yùn)轉(zhuǎn)結(jié)果如下: 輸入:輸入: 12 22 輸出:輸出:

19、 a=22,b=12第8章 指針兩點(diǎn)闡明: (1) 假設(shè)在函數(shù)體中交換指針變量的值,實(shí)參a、b的值并不改動(dòng),指針參數(shù)亦是傳值。 例如: int *p; p=p1; p1=p2; p2=p; 不要希望如此完成處置。 (2) 函數(shù)中交換值時(shí)不能運(yùn)用無(wú)初值的指針變量作暫時(shí)變量。 例如: int *p; *p=*p1; *p1=*p2; *p2=*p; p無(wú)確定值,對(duì) p的運(yùn)用能夠帶來(lái)不可預(yù)期的后果。第8章 指針8.2.2 指針函數(shù)指針函數(shù)指針函數(shù):是指前往值為指針的函數(shù)是指前往值為指針的函數(shù)指針函數(shù)的定義方式:指針函數(shù)的定義方式: 類型標(biāo)示符類型標(biāo)示符 *函數(shù)名參數(shù)函數(shù)名參數(shù)例如:例如:int *f

20、un(int a,int b) 函數(shù)體語(yǔ)句函數(shù)體語(yǔ)句 在函數(shù)體中有前往指針或地址的語(yǔ)句,形如在函數(shù)體中有前往指針或地址的語(yǔ)句,形如: return (&變量名變量名);或或 return (指針變量指針變量);并且前往值的類型要與函數(shù)類型一致。并且前往值的類型要與函數(shù)類型一致。 第8章 指針例8.3 分析如下程序main( ) int a,b,*p; int *max(int x,int y); scanf(“%d,%d,&a,&b); p=max(a,b); printf(“max=%d,*p); int *max(int x,int y) if (xy) retur

21、n (&x); else return (&y); 第8章 指針8.2.3 指向函數(shù)的指針 一個(gè)函數(shù)包括一組指令序列,存儲(chǔ)在某一段內(nèi)存中,這段內(nèi)一個(gè)函數(shù)包括一組指令序列,存儲(chǔ)在某一段內(nèi)存中,這段內(nèi)存空間的起始地址稱為函數(shù)的入口地址存空間的起始地址稱為函數(shù)的入口地址 稱函數(shù)入口地址為函數(shù)的指針。函數(shù)名代表函數(shù)的入口地址稱函數(shù)入口地址為函數(shù)的指針。函數(shù)名代表函數(shù)的入口地址 可以定義一個(gè)指針變量,其值等于該函數(shù)的入口地址,指向這可以定義一個(gè)指針變量,其值等于該函數(shù)的入口地址,指向這個(gè)函數(shù),這樣經(jīng)過(guò)這個(gè)指針變量也能調(diào)用這個(gè)函數(shù)。這種指針變個(gè)函數(shù),這樣經(jīng)過(guò)這個(gè)指針變量也能調(diào)用這個(gè)函數(shù)。這

22、種指針變量稱為指向函數(shù)的指針變量。量稱為指向函數(shù)的指針變量。定義指向函數(shù)的指針變量的普通方式為:定義指向函數(shù)的指針變量的普通方式為: 類型標(biāo)識(shí)符類型標(biāo)識(shí)符*指針變量名指針變量名)( ); 例如:例如: int (*p)(); /* 指針變量指針變量p可以指向一個(gè)整型函數(shù)可以指向一個(gè)整型函數(shù)*/ float (*q)(); /* 指針變量指針變量q可以指向一個(gè)浮點(diǎn)型函數(shù)可以指向一個(gè)浮點(diǎn)型函數(shù)*/第8章 指針 剛定義的指向函數(shù)的指針變量,亦象其它指針變量一樣要賦剛定義的指向函數(shù)的指針變量,亦象其它指針變量一樣要賦以地址值才干援用。當(dāng)將某個(gè)函數(shù)的入口地址賦給指向函數(shù)的以地址值才干援用。當(dāng)將某個(gè)函數(shù)的

23、入口地址賦給指向函數(shù)的指針變量,就可用該指針變量來(lái)調(diào)用所指向的函數(shù)指針變量,就可用該指針變量來(lái)調(diào)用所指向的函數(shù) 給函數(shù)指針賦初值:將函數(shù)名函數(shù)的入口地址值賦給指給函數(shù)指針賦初值:將函數(shù)名函數(shù)的入口地址值賦給指針變量針變量 例如例如 int m, (*p)( ); int max(int a,int b);那么可以那么可以 p=max; /* p指向函數(shù)指向函數(shù)max() */指針調(diào)用函數(shù)的指針調(diào)用函數(shù)的 普通方式為:普通方式為: (*指針變量指針變量)( 實(shí)參表實(shí)參表); 如上例:如上例:m=(*p)(12,22); /*比較比較 m=max(12,22); */第8章 指針留意: 用函數(shù)指針

24、調(diào)用函數(shù)是間接調(diào)用,沒(méi)有參數(shù)類型闡明,用函數(shù)指針調(diào)用函數(shù)是間接調(diào)用,沒(méi)有參數(shù)類型闡明,C編譯系統(tǒng)也無(wú)法進(jìn)展類型檢查,因此,在運(yùn)用這種方編譯系統(tǒng)也無(wú)法進(jìn)展類型檢查,因此,在運(yùn)用這種方式調(diào)用函數(shù)時(shí)要特別小心。實(shí)參一定要和指針?biāo)负瘮?shù)式調(diào)用函數(shù)時(shí)要特別小心。實(shí)參一定要和指針?biāo)负瘮?shù)的形參類型一致。的形參類型一致。 函數(shù)指針可以作為函數(shù)參數(shù),此時(shí),當(dāng)函數(shù)指針每次函數(shù)指針可以作為函數(shù)參數(shù),此時(shí),當(dāng)函數(shù)指針每次指向不同的函數(shù)時(shí),可執(zhí)行不同的函數(shù)來(lái)完成不同的功指向不同的函數(shù)時(shí),可執(zhí)行不同的函數(shù)來(lái)完成不同的功能能 例例 8.4 函數(shù)函數(shù)max()用來(lái)求一維數(shù)組的元素的最大值,在用來(lái)求一維數(shù)組的元素的最大值,在

25、主調(diào)函數(shù)中用函數(shù)名調(diào)用該函數(shù)與用函數(shù)指針調(diào)用該函主調(diào)函數(shù)中用函數(shù)名調(diào)用該函數(shù)與用函數(shù)指針調(diào)用該函數(shù)來(lái)實(shí)現(xiàn)。數(shù)來(lái)實(shí)現(xiàn)。第8章 指針程序如下: #include stdio.h #define M 8 main() float sumf,sump; float aM=11,2,-3,4.5,5,69,7,80; float (*p)(); /*定義指向函數(shù)的指針p*/ float max(float a,int n); /*函數(shù)聲明*/ p=max; /*函數(shù)名函數(shù)入口地址賦給指針p*/ sump=(*p)(a,M); /*用指針?lè)绞秸{(diào)用函數(shù)*/ sumf=max(a,M); /*用函數(shù)名調(diào)用ma

26、x()函數(shù)*/ printf(sump=%.2fn,sump); printf(sumf=%.2fn,sumf); 第8章 指針程序接上頁(yè):float max(float a,int n) int k;float s;s=a0;for (k=0;kn;k+) if (sak) s=ak; return s;程序運(yùn)轉(zhuǎn)結(jié)果:sump=80.00 sumf=80.00第8章 指針指向函數(shù)的指針的運(yùn)用步驟:1 定義一個(gè)指向函數(shù)的指針變量,形如: float (*p)();2 為函數(shù)指針賦值,格式如下: p=函數(shù)名; 留意:賦值時(shí)只需給出函數(shù)名,不要帶參數(shù)。3 經(jīng)過(guò)函數(shù)指針調(diào)用函數(shù),調(diào)用格式如下: s=

27、(*p)(實(shí)參);第8章 指針8.3 指針與數(shù)組8.3.1 指向一維數(shù)組的指針指向一維數(shù)組的指針數(shù)組名是一個(gè)常量指針,它的值為該數(shù)組的首地址數(shù)組名是一個(gè)常量指針,它的值為該數(shù)組的首地址 1.指向數(shù)組的指針的定義方法與指向根本類型變量指向數(shù)組的指針的定義方法與指向根本類型變量的指針的定義方法一樣,例如:的指針的定義方法一樣,例如:int a10=1,3,5,7,9;int *p;p=&a2; (把數(shù)組元素把數(shù)組元素a2的地址賦給指針變量的地址賦給指針變量p)p=a; (把數(shù)組的首地址賦給指針變量把數(shù)組的首地址賦給指針變量p)第8章 指針C言語(yǔ)規(guī)定:數(shù)組名代表數(shù)組首地址,是一個(gè)地址常量。因

28、此,下面兩個(gè)語(yǔ)句等價(jià): p=&a0; p=a;在定義指針變量的同時(shí)可賦初值: int a10, *p=&a0; (或 int *p=a;)等價(jià)于:int *p; p=&a0; 兩句。第8章 指針指向數(shù)組的指針變量p&a013151719pa0:a9p9a+0p+1 或 a+1p+9 或 a+9*a+9) 或*(p+9)第8章 指針2.經(jīng)過(guò)指針援用數(shù)組元素 *p=5;表示對(duì)p當(dāng)前所指的數(shù)組元素賦以一個(gè)值5。C規(guī)定:p+1指向數(shù)組的下一元素(而不是將p值簡(jiǎn)單地加1)。p+1意味著使p的原值地址加d個(gè)字節(jié)d為一個(gè)數(shù)組元素所占的字節(jié)數(shù)。假設(shè)p的初值為&a0,那么

29、:1p+i和a+i就是ai的地址,或者說(shuō)它們指向a數(shù)組的第i個(gè)元素見(jiàn)下頁(yè)圖。2*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素,即ai。3指向數(shù)組的指針變量也可以帶下標(biāo),如pi與*(p+i)、 ai等價(jià) 。第8章 指針*(p+i)a數(shù)組a0a1a2aia9pp+1,a+1p+i, a+ip+9, a+9 綜上所述,援用一個(gè)數(shù)組元素有二法: 1下標(biāo)法:如ai方式; 2指針?lè)ǎ喝?(a+i)或 *(p+i)。其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值p=a。第8章 指針main()int a10;int i;for (i=0;i10;i+)scanf(%d,&ai);prin

30、tf(n);for (i=0;i10;i+)printf(%d, ai ) ;例8.5 用三種方法輸出數(shù)組全部元素。(1)下標(biāo)法第8章 指針main()int a10;int i;for (i=0;i10;i+)scanf(%d,&ai);printf(n);for (i=0;i10;i+)printf(%d, *(a+i) );(2)經(jīng)過(guò)數(shù)組名計(jì)算數(shù)組元素地址經(jīng)過(guò)數(shù)組名計(jì)算數(shù)組元素地址,輸出元素的值輸出元素的值第8章 指針(3)用指針變量指向數(shù)組元素main()int a10;int *p,i;for (i=0;i10;i+)scanf(%d,&ai);printf(n);f

31、or (p=a;p(a+10);p+)printf(%d, *p ); 三種方法的比較:三種方法的比較:用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素;用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素;而用指針?lè)敲磮?zhí)行效率更高。而用指針?lè)敲磮?zhí)行效率更高。第8章 指針運(yùn)用指針變量時(shí),應(yīng)留意:1指針變量可實(shí)現(xiàn)使本身的值改動(dòng)。 P+合法;但a+不合法a是數(shù)組名,代表數(shù)組首地址,在程序運(yùn)轉(zhuǎn)中是固定不變的。2要留意指針變量的當(dāng)前值。main()int a10;int *p, i;p=a;for ( ;pa+10;p+) scanf(%d,p);printf(n);for ( ;p(a+10);p+)printf(

32、%d, *p ); 不能&p添加:p=a;第8章 指針3*p+相當(dāng)于*(p+),由于*與+優(yōu)先級(jí)一樣,且結(jié)合方向從右向左,其作用是先獲得p指向變量的值,然后執(zhí)行p=p+1;4*(p+)與*(+p)意義不同,后者是先p=p+1,再獲得p指向的變量值。 假設(shè)p=a,那么輸出*(p+)是先輸出a0,再讓p指向a;輸出*(+p)是先使p指向a,再輸出p所指的a。5*p+表示的是將p指向的變量值+ 第8章 指針8.3.2 二維數(shù)組與多維數(shù)組的指針表示法 1.二維數(shù)組的地址二維數(shù)組的地址設(shè)有一個(gè)二維數(shù)設(shè)有一個(gè)二維數(shù) 組組a,它有三行四列它有三行四列: int a34;數(shù)組名數(shù)組名a: 代表整個(gè)二維

33、數(shù)組的首地址,也就代表整個(gè)二維數(shù)組的首地址,也就是第是第0行的首地址。行的首地址。a+i: 代表第代表第i行的首地址。行的首地址。(見(jiàn)下頁(yè)圖見(jiàn)下頁(yè)圖) 第8章 指針數(shù)組名a代表整個(gè)二維數(shù)組的首地址:a0a1a2a=19173111951321上圖 a數(shù)組包含三個(gè)元素:a0,a1,a2. 而每個(gè)元素又是一個(gè)一維數(shù)組,它包含4個(gè)元素(即4個(gè)列元素),如:a0又包含:a00,a01,a02,a03.71523第8章 指針 一維數(shù)組名ai: 代表第i 行的首地址,即第i行中第0列元素的地址既&ai0)。 ai+j: 代表第i行中的第j個(gè)元素的地址,即為&aij。 留意地址變化的單位數(shù)值

34、在不同的場(chǎng)所的實(shí)踐字節(jié)數(shù)是不同的: “a+1中的“1實(shí)踐代表數(shù)組中一行元素所占的總字節(jié)數(shù); “ai+1中的“1 代表數(shù)組中一個(gè)元素所占的字節(jié)數(shù)。 第8章 指針a+2 a數(shù)組a0a1a2aa+1(2000)(2019)(2019)a代表第0行的首地址,a+1代表第1行的首地址,a+2代表第2行的首地址.每行存放4個(gè)整型數(shù)據(jù)(即1個(gè)元素占2個(gè)字節(jié)),因此,這里+1的含義是:+4*2=+8個(gè)字節(jié).第8章 指針 2000120193201952019720199201911201913201915201917202119202021202223aa+1a+2a0+1 a0+2 a0+3行地址,元素地址

35、的表示法第8章 指針例例8.6 8.6 用指針表示法輸出二維數(shù)組的各元素。用指針表示法輸出二維數(shù)組的各元素。#includemain()static int a23=0,1,2,3,4,5; int k,j,*p; for (j=0;j2;j+) /* 方式1 */ for (k=0;k3;k+) printf(%5d,*(aj+k); /* aj是j行首地址,aj+k是j行k列元素的地址*/ putchar(n); putchar(n);第8章 指針接上頁(yè):for (j=0;j2;j+) /* 方式方式2 */ for (k=0;k3;k+) printf(%5d,*(*(a+j)+k);

36、/* *(a+j)是是j行首地址,行首地址,*(a+j)+k是是j行行k列元素的地址列元素的地址*/ putchar(n); p=a; /* p指向數(shù)組的第一個(gè)元素指向數(shù)組的第一個(gè)元素 */ for (j=0;j2;j+) /* 方式方式3 */ for (k=0;k=n) p+=n-1; /*指針指到要復(fù)制的第一個(gè)字符指針指到要復(fù)制的第一個(gè)字符 */ 第8章 指針for (;*p!=0;p+,q+) *q=*p; *q=0; /* 字符串以0 結(jié)尾 */ printf(String a : %sn,a); printf(String b : %sn,b); 輸入: 3輸出: computer

37、 mputer第8章 指針8.4.2 字符串?dāng)?shù)組字符串?dāng)?shù)組字符串?dāng)?shù)組:是指數(shù)組中的每個(gè)元素都是一個(gè)存字符串?dāng)?shù)組:是指數(shù)組中的每個(gè)元素都是一個(gè)存 放放字符串的數(shù)組。字符串的數(shù)組。字符串?dāng)?shù)組可以用一個(gè)二維字符數(shù)組來(lái)存儲(chǔ)。字符串?dāng)?shù)組可以用一個(gè)二維字符數(shù)組來(lái)存儲(chǔ)。例如:例如:char languge3 10;數(shù)組的第一個(gè)下標(biāo)決議字符串的個(gè)數(shù),第二個(gè)下標(biāo)數(shù)組的第一個(gè)下標(biāo)決議字符串的個(gè)數(shù),第二個(gè)下標(biāo)是字符串的最大長(zhǎng)度實(shí)踐最多是字符串的最大長(zhǎng)度實(shí)踐最多9個(gè)字符,個(gè)字符,0占占一位置。一位置。可以對(duì)字符串?dāng)?shù)組賦初值。例如:可以對(duì)字符串?dāng)?shù)組賦初值。例如:char languge3 10;=“Basic, “c+

38、, “pascal第8章 指針8.5 8.5 指針數(shù)組與命令行參數(shù)指針數(shù)組與命令行參數(shù)8.5.1 8.5.1 指針數(shù)組指針數(shù)組 指針數(shù)組:是指針變量的集合。即它的每一個(gè)指針數(shù)組:是指針變量的集合。即它的每一個(gè)元素都是指針變量,且都具有一樣的存儲(chǔ)類元素都是指針變量,且都具有一樣的存儲(chǔ)類別和指向一樣的數(shù)據(jù)類型。別和指向一樣的數(shù)據(jù)類型。指針數(shù)組的定義方式為:指針數(shù)組的定義方式為: 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 * *數(shù)組名數(shù)組名 數(shù)組長(zhǎng)度闡明數(shù)組長(zhǎng)度闡明 ;例如:例如: int int * *p10;p10;由于由于 比比* *的優(yōu)先級(jí)高,因此的優(yōu)先級(jí)高,因此p p先與先與 10 10結(jié)合結(jié)合成成p10p1

39、0,而,而p10p10正是數(shù)組的定義方式,共正是數(shù)組的定義方式,共有有1010個(gè)元素。最后個(gè)元素。最后p10p10與與* *結(jié)合結(jié)合, ,表示它的表示它的各元素可以指向一個(gè)整型變量。各元素可以指向一個(gè)整型變量。第8章 指針指針數(shù)組廣泛運(yùn)用于對(duì)字符串的處置指針數(shù)組廣泛運(yùn)用于對(duì)字符串的處置例如有定義:例如有定義: char *p3;定義了一個(gè)具有三個(gè)元素定義了一個(gè)具有三個(gè)元素p0,p1,p2的指針數(shù)組。的指針數(shù)組。每個(gè)元素都可以指向一個(gè)字符數(shù)組,或字符串。每個(gè)元素都可以指向一個(gè)字符數(shù)組,或字符串。假設(shè)利用數(shù)組初始化,那么:假設(shè)利用數(shù)組初始化,那么:char *p3= “Basic, “c+, “p

40、ascal; P0指向字符串指向字符串“Basic;P1指向字符串指向字符串“c+;P2指向字符串指向字符串“pascal ;第8章 指針例8.9 字符指針數(shù)組的賦值 #define NULL 0 main( ) static char a =“Fortran; static char b =“COBOL; static char c =“Pascal; int i; char *p4; p0=a; p1=b; p2=c; p3=NULL; for (i=0;pi!=NULL;i+) printf(“Language %d is %sn,i+1,pi); 第8章 指針例8.10 有假設(shè)干本書(shū),

41、將書(shū)名按字典順序排序#include#includemain() char *bname=Programming in ANSI C,BASIC,Visual C+ 6.0 Programming ,TRUBO C 2.0; int i,m; void sort(char *name,int); m=sizeof(bname)/sizeof(char *); /*字符串個(gè)數(shù)字符串個(gè)數(shù)*/ sort(bname,m); /* 排序,改動(dòng)指針的銜接關(guān)系排序,改動(dòng)指針的銜接關(guān)系*/ printf(n); for (i=0;im;i+) /* 輸出排序結(jié)果輸出排序結(jié)果*/ printf(%8s,bna

42、mei);第8章 指針void sort(char *name, int n) /*選擇排序*/char *t; int i,j,k; /* k記錄每趟最小值下標(biāo) */ for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; /* 第j個(gè)元素更小*/ if (k!=i) /* 最小元素是該趟的第一個(gè)元素 那么不需交換 */ t=namei;namei=namek;namek=t; 輸出結(jié)果為: BASIC Programming in ANSI C TRUBO C 2.0 Visual C+ 6.0 Programming 第8章 指針留意:留意: (1)字符數(shù)組

43、中每個(gè)元素可存放一個(gè)字符,而字符指針變量字符數(shù)組中每個(gè)元素可存放一個(gè)字符,而字符指針變量存放字符串首地址,而不是存放在字符指針變量中。存放字符串首地址,而不是存放在字符指針變量中。 (2)對(duì)字符數(shù)組,與普通數(shù)組一樣,不能對(duì)其進(jìn)展整體賦值,對(duì)字符數(shù)組,與普通數(shù)組一樣,不能對(duì)其進(jìn)展整體賦值,只能給各個(gè)元素賦值,而字符指針變量可以直接用字符串常量只能給各個(gè)元素賦值,而字符指針變量可以直接用字符串常量賦值。例如,假設(shè)有如下定義:賦值。例如,假設(shè)有如下定義: char a10; char *p;那么語(yǔ)句那么語(yǔ)句 a=computer;是非法的,由于數(shù)組名;是非法的,由于數(shù)組名a是一是一個(gè)常量指針,不能對(duì)其賦值。只能對(duì)各個(gè)元素分別賦值:個(gè)常量指針,不能對(duì)其賦值。只能對(duì)各個(gè)元素分別賦值: a0=c;a1=o;a2=m;a3=p;a7=r;但語(yǔ)句但語(yǔ)句: p=computer; 是合法的。是合法的。 第8章 指針8.5.2 8.5.2 指針數(shù)組與命令行參數(shù)指針數(shù)組與命令行參數(shù) 在操作系統(tǒng)命令形狀下,可以輸入程序或命令使其運(yùn)轉(zhuǎn),稱命令行形狀。輸入的命令或運(yùn)轉(zhuǎn)程序及該命令或程序所需的

溫馨提示

  • 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)論