科銳3第07講指針_第1頁(yè)
科銳3第07講指針_第2頁(yè)
科銳3第07講指針_第3頁(yè)
科銳3第07講指針_第4頁(yè)
科銳3第07講指針_第5頁(yè)
已閱讀5頁(yè),還剩13頁(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講 指針第五章 指針 指針運(yùn)算是地址的運(yùn)算( T *px) px+n, px-n 將指針從當(dāng)前位置向前或向后移動(dòng)n個(gè)數(shù)據(jù)單位,而不是n個(gè)字節(jié)。 這取決于指針?biāo)赶虻臄?shù)據(jù)類型(T)。 pxn的結(jié)果為: pxnsizeof(T) px-py求出的是兩指針位置之間的數(shù)據(jù)個(gè)數(shù),而不是地址差。 px-py的結(jié)果為:( px-py) / sizeof(T) y= px+y= ( px+ ), 注意優(yōu)先級(jí)和結(jié)合順序 y= + pxy= ( + px) 問(wèn)題:y= px+和y= (px)+的意義struct student int number; char name4;student *pst;5.1 指

2、針及其運(yùn)算 5.1.1 指針的算術(shù)運(yùn)算pstpst=pst+1; 5.1.3 指針的關(guān)系運(yùn)算 是對(duì)兩個(gè)相同類型的指針的運(yùn)算,如pxpy,當(dāng)px所指位置在py之前時(shí),表達(dá)式的值為 1,否則為0。px=0, px!=0用來(lái)判斷px是否為空指針。 不同類型的指針以及指針和一般整數(shù)間的關(guān)系運(yùn)算是無(wú)意義的。 5.1.4 指針的賦值運(yùn)算 賦的值必須是地址常量或變量,而不能是普通整數(shù),有以下幾種形式: 1. 變量地址賦予指向相同數(shù)據(jù)類型的指針 char c, *pc; pc=&c; 2.指針賦予相同數(shù)據(jù)類型的另一指針 int *p, *q; p=q; 3.其它形式 int *p, *q, n; p=q+n;

3、 p+=n;5.2 指針和數(shù)組 5.2.1 指針與數(shù)組的關(guān)系 可以用指針代替數(shù)組下標(biāo)來(lái)訪問(wèn)數(shù)組: f ( ) int a5; int *pa; *(pa+3)=10; pa3=10; *(a+3)=10; a3=10; 指針與數(shù)組的差異:指針是地址變量,可任意改變它的值;而數(shù)組名是地址常量,其值不能改變。 5.2.2 字符指針與字符數(shù)組 可用字符數(shù)組表示字符串,也可用字符指針指向字符串的首址。 指針表示字符串可以賦多個(gè)串值,只要將字符串的首址賦給它。 字符數(shù)組是常量不能賦值。 ex. 1 include main ( ) static char str =“string”; char *ps;

4、 ps=str; while ( *ps !=0) cout*ps; ps+; coutendl; 5.2.3 指針數(shù)組 指向同一類型對(duì)象的指針組成的數(shù)組。每個(gè)數(shù)組元素都是一指針變量。 存儲(chǔ)類型 數(shù)據(jù)類型 * 指針數(shù)組名元素個(gè)數(shù) ex. 2 void main ( ) int a23, *pa2; pa0=a0; pa1=a1; for ( int i=0; i3; i+ ) *( pa0+i)=i; for ( i=0; i3; i+ ) *( pa1+i)=i; 5.3 指針和函數(shù) 5.3.1 指針函數(shù)(指針作為函數(shù)的返回值) 存儲(chǔ)類型 數(shù)據(jù)類型 * 函數(shù)名(參數(shù)表) ex. 3 char

5、 *string_name ( int n ) char * string = “illegal string”, “string 1”, “string 2”, “string 3” return ( n3 ) ? string0: stringn; static 返回的是變量地址,必須保證函數(shù)返回后,這個(gè)變量仍然存在。要返回函數(shù)中局部變量的地址,應(yīng)聲明為靜態(tài)的。 問(wèn)題: char sname20; sname=string_name(n); 5.3.1 函數(shù)指針(函數(shù)的入口地址可賦給指針) 雖然函數(shù)不是變量,仍占存儲(chǔ)空間,此空間的首地址函數(shù)入口地址。 存儲(chǔ)類型 數(shù)據(jù)類型 (* 函數(shù)指針名)

6、(參數(shù)表) ex. 4 int (*fp) ( char ); /fp為一函數(shù)指針, 此函數(shù) 的返回值為int,參數(shù)為char 要將函數(shù)指針指向一具體的函數(shù),用賦值語(yǔ)句: ex. 5 int f( char ); fp=f; 與普通變量指針不同,函數(shù)指針指向程序代碼區(qū),而不是數(shù)據(jù)存儲(chǔ)區(qū)。 int i= (*fp) (a); int i=f (a) ; 要保證函數(shù)指針的參數(shù)和返回值與所指向的函數(shù)正好匹配。 ex. 6 void (*fp) ( char * ); void f1(char * ); int f2( char * ); void f3( int * ); void f( ) fp=

7、&f1; fp=&f2; fp=&f3; (* fp) (“asdf”); (* fp) (1); int i=(*fp) (“qwer”); C+不能把函數(shù)當(dāng)作參數(shù)傳遞,但傳遞函數(shù)指針允許。 ex. 7 void sort ( void * base, unsigned int n, unsigned int sz, int (*cmp) (void*, void* ) /把n個(gè)元素的向量base按升序排列,向量每個(gè)元素大小sz for(int i=0; in-1;i+) for (int j=n-1; ij; j-) char *pj=(char * ) base+j*sz; /bj ch

8、ar *pj1=pj-sz; /bj-1 if(*cmp)(pj,pj1)0) for( int k=0; ksz; k+) char temp=pjk; pjk=pj1k; pj1k=temp; void * 性質(zhì):任何類型的指針都可以賦給它。作為參數(shù)傳入指向任何類型的指針都可與它匹配。 兩個(gè)比較函數(shù): #include int cmp_int ( void *p, void *q) if ( * (int *) p * (int *) q ) return 1; else if ( * (int *) p = * (int *) q ) return 0; else return 1; i

9、nt cmp_str ( void *p, void *q ) return strcmp ( * (char *) p, * (char *) q ); 主程序: #include int main ( ) static int ii = 3,9,5,4; static char * str = “compare”, “the”, “string” ; sort ( ii, 4, sizeof (int), &cmp_int ); sort ( str, 3, sizeof ( char *) , &cmp_str ); cout“The result of sort string:”end

10、l; for ( int i=0; i3; i+) coutstr i 按指針訪問(wèn)成員。 如:LiMing. Salary=1200.56; p-sex=M; 5.5.3 結(jié)構(gòu)、指針和數(shù)組 結(jié)構(gòu)名 結(jié)構(gòu)數(shù)組名元素個(gè)數(shù); 結(jié)構(gòu)名 *結(jié)構(gòu)指針名; ex. 10 person company52; person * pany; cout(*(pperson+3).nameendl;結(jié)構(gòu)中成員指針的類型沒(méi)有任何限制,可以是基本類型,也可以是結(jié)構(gòu),甚至可以定義引用自身的結(jié)構(gòu)。 ex. 11 struct inode int data; inode *next; ;舉例:70%的學(xué)生通過(guò)考試,從鍵盤輸入學(xué)

11、生姓名和成績(jī),按分?jǐn)?shù)高低輸出,并用pass或fail表示是否通過(guò)考試 ex. 12 #include #include struct STUDENT char name30; int grade; ; void sortclass(STUDENT st , int nst); void swap(STUDENT &ps1, STUDENT &ps2); void main( ) STUDENT *classes; int ns; coutns; classes=new STUDENTns; cout“Enter name and grade for each studentn”; for (i

12、nt i=0; classesi.grade; sortclass(classes, ns); const int cutoff=(ns*7)/10-1; for( i=0; ins; i+) “ “classi.grade; if(i=cutoff) cout“passn”; else cout“failn”; void sortclass(STUDENT st , int nst) for( int i=0; i(nst-1); i+) int pick=i; for(int j=i+1; jstpick.grade ) pic

13、k=j; swap(sti, stpick); void swap(STUDENT &ps1, STUDENT &ps2) STUDENT temp; strcpy(, ); temp.grade=ps1.grade; strcpy(, ); ps1.grade=ps2.grade; strcpy(, ); ps2.grade=temp.grade; 5.5.5 聯(lián)合 union 聯(lián)合名 數(shù)據(jù)類型 成員名1; 數(shù)據(jù)類型 成員名2; 數(shù)據(jù)類型 成員名n; ; 成員1、成員2、成員n共享內(nèi)存,編譯器

14、總是按聯(lián)合中最大成員類型分配內(nèi)存。 5.5.6 枚舉(一個(gè)有名字的整數(shù)集合) enum 枚舉名 標(biāo)識(shí)符1,標(biāo)識(shí)符2, ,標(biāo)識(shí)符n 例如:enum color red, white, black; /red=0, white=1, black=2 color chair; /chair 的取值只能是red, white或black 枚舉的使用: ex. 13 viod f( ) color suit=white; int i=red; suit=i; /錯(cuò), suit=color(i); /正確,把整數(shù)賦給枚舉類型要強(qiáng)制類型轉(zhuǎn)換 i=suit; suit=4; /錯(cuò) 在特定時(shí)刻,聯(lián)合只有一個(gè)成員

15、被保存,而不提供其它成員的信息。 標(biāo)識(shí)符的值也可以自己定義: 例如:enum color red, white=7, black=2; 匿名枚舉表示一組常量: 例如:enum ASM,AUTO,BREAK; const int ASM=0; const int AUTO=1; const int BREAK=2; 5.5.7 類型定義 typedef (為數(shù)據(jù)類型定義新名) typedef char * STRING; char *str; typedef char (*PFC) (int, char *); PFC f1;STRING str; 5.6 結(jié)構(gòu)與函數(shù) 5.6.1 結(jié)構(gòu)用作函數(shù)參數(shù)和返回值 多個(gè)成員的參數(shù)傳遞效率

溫馨提示

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