版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、本章導(dǎo)讀 指針是C 語言中的一個重要的概念,也是C 語言的一個重要特色。正確而靈活地運用它,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動態(tài)分配內(nèi)存;能方便地使用字符串;有效而方便地使用數(shù)組,能直接處理內(nèi)存地址等,這對設(shè)計系統(tǒng)件是很必要的。掌握指針的應(yīng)用,可以使程序簡潔、緊湊、高效。每一個學(xué)習(xí)和使用C 語言的人,都應(yīng)當(dāng)深入地學(xué)習(xí)和掌握指針??梢哉f,不掌握指針就不掌握C的精華。 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本書目錄第6章 指針與引用本章主要知識點 (1) 關(guān)于指針的C程序?qū)嵗?(2) 指針 (3)指針與數(shù)組 (4) 指針與函數(shù)(5) 多級指針與指針數(shù)組 (6) 內(nèi)存管理 (7)引用
2、第6章 指針與引用 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本章導(dǎo)讀 6.2 指針 6.3 指針與數(shù)組 6.5 多級指針與指針數(shù)組 6.4 指針與函數(shù) 6.1 關(guān)于指針的C程序?qū)嵗?.6 引用6.7 內(nèi)存管理 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本章目錄6.1.1 C程序?qū)嵗?.1 關(guān)于指針的C程序?qū)嵗?C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄2. C程序?qū)嵗?2)1. C程序?qū)嵗?1)6.1.1 C程序?qū)嵗?.1.1 C程序?qū)嵗?) C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1.C程序?qū)嵗?【例6.1】指針變量的定義
3、示例。 /*程序名為l5_1.cpp */*程序功能:驗證指針變量的定義*/ main() int num_int=12, *p_int; /*定義一個指向int型數(shù)據(jù)的指針變量p_int */ float num_f=3.14, *p_f; /*定義一個指向float型數(shù)據(jù)的指針變量p_f */ char num_ch=p, *p_ch; /*定義一個指向char型數(shù)據(jù)的指針變量p_ch */ p_int=&num_int; /*取變量num_int的地址,賦值給p_int */ p_f=&num_f; /*取變量num_f的地址,賦值給p_f */ p_ch=&num_ch; /*取變量n
4、um_ch的地址,賦值給p_ch */ printf(“num_int=%d, *p_int=%dn”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2fn”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%cn”, num_ch, *p_ch); 程序運行結(jié)果:num_int=12, *p_int=12num_f=3.14, *p_f=3.14num_ch=p, *p_ch=p程序演示例6.1程序演示單擊運行輸入源程序彈出運行結(jié)果窗口返回例題返回本節(jié)目錄6.1.1 C程序?qū)嵗?) C語言程序設(shè)計 (Visu
5、al C+ 6.0環(huán)境)2.C程序?qū)嵗?【例6.2】輸入2個整數(shù),按升序(從小到大排序)輸出。/*程序名為l5_2.cpp */*程序功能:使用指針變量求解2個整數(shù)的升序輸出*/main() int num1,num2; int *num1_p=&num1, *num2_p=&num2, *pointer; printf(“Input the first number: ”); scanf(“%d”,num1_p); printf(“Input the second number: ”); scanf(“%d”,num2_p); printf(“num1=%d, num2=%dn”, num1
6、, num2); if( *num1_p *num2_p ) /*如果num1num2,則交換指針*/ pointer= num1_p; num1_p= num2_p; num2_p=pointer; printf(“min=%d, max=%dn”, *num1_p, *num2_p); 程序運行情況:Input the first number:9Input the second number:6num1=9, num2=6min=6, max=9返回本節(jié)目錄程序演示例6.2程序演示單擊運行輸入源程序彈出運行結(jié)果窗口返回例題返回本節(jié)目錄 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返
7、回本章目錄6.2.2 指向變量的指針變量6.2.1 地址和指針的概念6.2 指針 6.2.1 地址和指針的概念 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)1.內(nèi)存地址內(nèi)存中存儲單元的編號2.變量地址系統(tǒng)分配給變量的內(nèi)存單元的起始地址 (1)計算機硬件系統(tǒng)的內(nèi)存儲器中,擁有大量的存儲單元(每個存儲單元容量為字節(jié))。為了方便管理,必須為每一個存儲單元編號,這個編號就是存儲單元的“地址”。每個存儲單元都有一個惟一的地址。(2)在地址所標(biāo)識的存儲單元中存放數(shù)據(jù)。注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個完全不同的概念。假設(shè)有這樣一個程序:main() int num; scanf(%d,&n
8、um); printf(num=%dn, num); C編譯程序編譯到該變量定義語句時,將變量num 登錄到“符號表”中。符號表的關(guān)鍵屬性有兩個:一是“標(biāo)識符名(id)” ,二是該標(biāo)識符在內(nèi)存空間中的“地址(addr)” 。為描述方便,假設(shè)系統(tǒng)分配給變量num的2字節(jié)存儲單元為 3000 和3001,則起始地址3000就是變量num在內(nèi)存中的地址。返回本節(jié)目錄6.2.1 地址和指針的概念 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)3.變量值的存取通過變量在內(nèi)存中的地址進行系統(tǒng)執(zhí)行“scanf(”%d“,&num);”和“printf(”num=%dn“, num);”時,存取變量num
9、值的方式可以有兩種:(1)直接訪問直接利用變量的地址進行存取 上例中scanf(“%d”,&num)的執(zhí)行過程是這樣的: 用變量名num作為索引值,檢索符號表,找到變量num的起始地址3000;然后將鍵盤輸入的值(假設(shè)為)送到內(nèi)存單元3000和3001中。 printf(num=%dn,num)的執(zhí)行過程,與scanf( )很相似: 首先找到變量num的起始地址3000,然后從3000和3001中取出其值,最后將它輸出。 返回本節(jié)目錄6.2.1 地址和指針的概念 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)(2)間接訪問通過另一變量訪問該變量的值 語言規(guī)定:在程序中可以定義一種特殊的變量
10、(稱為指針變量),用來存放其它變量的地址。 例如,假設(shè)定義了這樣一個指針變量num_pointer,它被分配到4000、4001單元,其值可通過賦值語句“num_pointer=num;”得到。此時,指針變量num_pointer的值就是變量num在內(nèi)存中的起始地址3000。 【例5.2】中 printf(“min=%d, max=%dn”, *num1_p, *num2_p); 語句:通過指針變量,間接訪問變量的值。返回本節(jié)目錄6.2.2 指向變量的指針變量 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1.指針與指針變量 (1)指針即地址 一個變量的地址稱為該變量的指針。通
11、過變量的指針能夠找到該變量。(2)指針變量專門用于存儲其它變量地址的變量指針變量num_pointer的值就是變量num的地址。指針與指針變量的區(qū)別,就是變量值與變量的區(qū)別。(3)為表示指針變量和它指向的變量之間的關(guān)系,用指針運算符“*”表示。 例如,指針變量num_pointer與它所指向的變量num的關(guān)系,表示為:*num_pointer,即*num_pointer等價于變量num。因此,下面兩個語句的作用相同:num=3; /*將3直接賦給變量num*/num_pointer=# /*使num_pointer指向num */*num_pointer=3; /*將3賦給指針變量nu
12、m_pointer所指向的變量*/6.2.2 指向變量的指針變量 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄2.指針變量的定義與應(yīng)用【例6.1】 程序中頭三行的變量定義語句指針變量的定義 與一般變量的定義相比,除變量名前多了一個星號“*” (指針變量的定義標(biāo)識符)外,其余一樣:數(shù)據(jù)類型 *指針變量, *指針變量2; 注意:此時的指針變量p_int、p_f、p_ch,并未指向某個具體的變量(稱指針是懸空的)。使用懸空指針很容易破壞系統(tǒng),導(dǎo)致系統(tǒng)癱瘓?!纠?.1】中間三行的賦值語句取地址運算()取地址運算的格式: 變量例如,&num_int、&num_f、&num_ch的結(jié)果,
13、分別為變量num_int、num_f、num_ch的地址。注意:指針變量只能存放指針(地址),且只能是相同類型變量的地址。C語言中用NULL表示空指針。若有語句:p=NULL;則表示指針p為空,沒有指向任何對象。 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本章目錄 6.3.2 通過指針引用數(shù)組元素6.3.1 指向數(shù)組元素的指針6.3 指針與數(shù)組6.3.3 數(shù)組名作函數(shù)參數(shù)6.3.4 指針與字符數(shù)組6.3.5 數(shù)組指針6.3.1 指向數(shù)組元素的指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境) 返回本節(jié)目錄指向數(shù)組的元素指針變量的定義,與指向普通變量的指針變量的定義方法一樣例如
14、,int array10; ( 定義array為包含10個整型變量的數(shù)組) int *pointer (定義pointer為指向整型變量的指針變量)應(yīng)當(dāng)注意,如果數(shù)組為int 型,則指針變量亦應(yīng)指向int 型。下面是對該指針賦值:pointer= &array0;把array0 元素的地址賦給指針變量pointer。也就是說,pointer 指向 array數(shù)組的第0號元素。C 語言規(guī)定數(shù)組名代表數(shù)組的首地址,也就是第一個元素的地址。因此,下面兩個語句等價pointer= &array0; pointerarray;注意:數(shù)組名不代表整個數(shù)組,上述“pointerarray;”的作用是“把ar
15、ray數(shù)組的第一個元素的地址賦給指針變量pointer”而不是“把array數(shù)組各元素的值賦給pointer”。 6.3.2 通過指針引用數(shù)組元素 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1 通過指針引用一維數(shù)組中的元素 如果有“int array10,*pointer=array;” ,則:(1)pointer+i和array+i都是數(shù)組元素arrayi的地址。 (2)*(pointer+i)和*(array+i)就是數(shù)組元素arrayi。(3)指向數(shù)組的指針變量,也可將其看作是數(shù)組名,因而可按下標(biāo)法來使用。例如,pointeri等價于*(pointer+i)。注意:p
16、ointer+1指向數(shù)組的下一個元素,而不是簡單地使指針變量pointer的值+1。其實際變化為pointer+1*size(size為一個元素占用的字節(jié)數(shù))。例如,假設(shè)指針變量pointer的當(dāng)前值為3000,則pointer+1為3000+1*2=3002,而不是3001。6.3.2 通過指針引用數(shù)組元素 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄【例6.3】 使用指向數(shù)組的指針變量來引用數(shù)組元素。/*程序名為l6_3.cpp */*程序功能:使用指向數(shù)組的指針變量來引用數(shù)組元素*/main() int array10, *pointer=array, i; print
17、f(“Input 10 numbers: ”); for(i=0; i10; i+) scanf(“%d”, pointer+i);/*使用指針變量來輸入數(shù)組元素的值*/ printf(“array10: ”); for(i=0; i10; i+) printf(“%d ”, *(pointer+i);/*使用指向數(shù)組的指針變量輸出數(shù)組*/ printf(“n”); 6.3.2 通過指針引用數(shù)組元素 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄程序運行情況:Input 10 numbers: 0 1 2 3 4 5 6 7 8 9array10: 0 1 2 3 4 5 6
18、7 8 9程序說明:程序中第3行和第6行的2個for語句,等價于下面的程序段:for(i=0; i10; i+,pointer+) scanf(“%d”,pointer);printf(“array10: ”);pointer=array; /*使pointer重新指向數(shù)組的第一個元素*/for(i=0; i10; i+,pointer+) printf(“%d”,*pointer); 6.3.2 通過指針引用數(shù)組元素 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄2 通過指針引用二維數(shù)組中的元素 在C語言中,二維數(shù)組是按行優(yōu)先的規(guī)律轉(zhuǎn)換為一維線性存放在內(nèi)存中的,因此,可以通過
19、指針訪問二維數(shù)組中的元素。 如果有:int aMN; 則將二維數(shù)組中的元素aij轉(zhuǎn)換為一維線性地址的一般公式是: 線性地址aiMj 其中:a為數(shù)組的首地址, M和N分別為二維數(shù)組行和列的元素個數(shù)。 6.3.2 通過指針引用數(shù)組元素 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄【例6.4】:給定某年某月某日,將其轉(zhuǎn)換成這一年的第幾天并輸出。 此題的算法很簡單,若給定的月是i,則將1、2、3、i-1月的各月天數(shù)累加,再加上指定的日。但對于閏年,二月的天數(shù)29天,因此還要判定給定的年是否為閏年。為實現(xiàn)這一算法,需設(shè)置一張每月天數(shù)列表,給出每個月的天數(shù),考慮閏年非閏年的情況,此表可設(shè)
20、置成一個2行13列的二維數(shù)組,其中第1行對應(yīng)的每列(設(shè)112列有效)元素是平年各月的天數(shù),第2行對應(yīng)的是閏年每月的天數(shù)。程序中使用指針作為函數(shù)day_of_year的形式參數(shù)。/*程序名為l6_4.cpp */*程序功能:使用指向數(shù)組的指針變量來引用數(shù)組元素*/#include main( ) static int day_tab213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31 ;int y, m, d;scanf(%d%d%d, &y, &m, &d); 6.3.2 通過指針引用數(shù)組
21、元素 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄printf(%dn, day_of_year(day_tab,y,m,d) ); /* 實參為二維數(shù)組名 */day_of_year(day_tab,year,month,day)int *day_tab; /* 形式參數(shù)為指針 */int year, month, day; int i, j;i = (year%4=0&year%100!=0) | year%400=0;for ( j=1; jmonth; j+ )day += *( day_tab+i*13+j ); /* day_tab+i*13+j:對二維數(shù)組中元素
22、進行地址變換 */return(day); 由于語言對于二維數(shù)組中的元素在內(nèi)存中是按行存放的,所以在函數(shù)day_of_year 中要使用公式day_tab+i*13+j計算main函數(shù)的day_tab中元素對應(yīng)的地址。 6.3.3 數(shù)組名作函數(shù)參數(shù) C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄數(shù)組名可以用作函數(shù)的形參和實參。如:main ( ) int array10 ;f ( array , 10 ) f ( arr , n )int arr , n ; array 為實參數(shù)組名,arr 為形參數(shù)組名。 6.3.3 數(shù)組名作函數(shù)參數(shù) C語言程序設(shè)計 (Visual C+ 6
23、.0環(huán)境)返回本節(jié)目錄【例6.5】將數(shù)組a 中n 個整數(shù)按相反順序存放 解此題的算法為:將a 0與an-1 對換,再將a1與an-2對換, ,直到將a(n-1)/2 與a n-int(n-1)/2) 對換。今用循環(huán)處理此問題,設(shè)兩個“位置指示變量”i 和j , i 的初值為0 , j 的初值為n-1。將ai與aj 交換,然后使i 的值加1 , j 的值減1 ,再將ai與aj對換,直到i =(n-1)/2 為止。程序如下:程序名為l6_5.cppVoid inv(int x,int n) /*形參x是數(shù)組名*/ int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+)j=n
24、-1-i;temp=xi;xiI=xj;xj=temp;return;main() int i,a10=3,7,9,11,0,6,7,5,4,2;for(i=0;i10;i+) 6.3.3 數(shù)組名作函數(shù)參數(shù) C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄printf(“%d,”,ai);printf(“n”);inv(a,10);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);運行情況如下:3,8,11,0,5,9,4,7,10,2,2,10,7,4,9,5,0,11,8,3,程序說明: 主函數(shù)中數(shù)組名為 a ,賦以各元素初值。函數(shù) in
25、v 中的形參數(shù)組名為 x ,在 inv 函數(shù)中不具體定義數(shù)組元素的個數(shù),元素個數(shù)由形參變量 n 傳入(今對應(yīng)的實參值為 10 )。這樣做可以增加函數(shù)的靈活性。即不必要求函數(shù) inv 中的形參數(shù)組 x 和 main 函數(shù)中的實參數(shù)組 a 長度相同。如果在main函數(shù)中有函數(shù)調(diào)用語句:“ inv ( a , 10 )”,表示要求對 a 數(shù)組的前 10 個元素實行題目要求的顛倒排列。如果改為 “inv ( a , 5 )” ,則表示將 a 數(shù)組的前 5 個元素實行顛倒排列,此時,函數(shù) inv 只處理 5 個數(shù)組元素。函數(shù) inv 中的 m 是 i 值的上限,當(dāng) i m 時,則結(jié)束循環(huán)過程。 6.3.
26、3 數(shù)組名作函數(shù)參數(shù) C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄 小結(jié): 引入指向數(shù)組的指針變量后,數(shù)組及指向數(shù)組的指針變量作函數(shù)參數(shù)時,可有種等價形式(本質(zhì)上是一種,即指針數(shù)據(jù)作函數(shù)參數(shù)):(1)形參、實參都用數(shù)組名(2)形參、實參都用指針變量(3)形參用指針變量、實參用數(shù)組名(4)形參用數(shù)組名、實參用指針變量 6.3.4 指針與字符數(shù)組 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1. 字符串的表示與引用在語言中,既可以用字符數(shù)組表示字符串,也可用字符指針變量來表示;引用時,既可以逐個字符引用,也可以整體引用。(1)逐個引用【例6.6】 使用字符指針變
27、量表示和引用字符串。/*程序名為l6_6.cpp /main() char *string=”I love Beijing.”; for(; *string!=0; string+) printf(“%c”, *string); printf(“n”); 程序運行結(jié)果: I love Beijing.程序說明:char *string=I love Beijing.;語句定義并初始化字符指針變量string:用串常量“I love Beijing.”的地址(由系統(tǒng)自動開辟、存儲串常量的內(nèi)存塊的首地址)給string賦初值。 6.3.4 指針與字符數(shù)組 C語言程序設(shè)計 (Visual C+ 6.
28、0環(huán)境)返回本節(jié)目錄(2)整體引用【例6.7】采取整體引用的辦法,改寫例5.9。/*程序名為l6_7.cpp */*程序功能:使用字符指針變量表示和引用字符串*/main() char *string=”I love Beijing.”; printf(“%sn”,string);程序說明:printf(“%sn”,string);語句 通過指向字符串的指針變量string,整體引用它所指向的字符串的原理:系統(tǒng)首先輸出string指向的第一個字符,然后使string自動加,使之指向下一個字符;重復(fù)上述過程,直至遇到字符串結(jié)束標(biāo)志。注意:其它類型的數(shù)組,是不能用數(shù)組名來一次性輸出它的全部元素的,
29、只能逐個元素輸出。 6.3.4 指針與字符數(shù)組 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄2.字符指針變量與字符數(shù)組之比較雖然用字符指針變量和字符數(shù)組都能實現(xiàn)字符串的存儲和處理,但二者是有區(qū)別的,不能混為一談。(1)存儲內(nèi)容不同。字符指針變量中存儲的是字符串的首地址,而字符數(shù)組中存儲的是字符串本身(數(shù)組的每個元素存放一個字符)。(2)賦值方式不同。對字符指針變量,可采用下面的賦值語句賦值: char *pointer; pointer=This is a example.;而字符數(shù)組,雖然可以在定義時初始化,但不能用賦值語句整體賦值。下面的用法是非法的: char char
30、_array20; char_array=This is a example.; /*非法用法*/(3)指針變量的值是可以改變的,字符指針變量也不例外; 6.3.4 指針與字符數(shù)組 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄3. 字符串指針作函數(shù)參數(shù)【例6.8】 用函數(shù)調(diào)用方式,實現(xiàn)字符串的復(fù)制。/*程序名為l6_8.cpp */*/*string_copy()函數(shù):復(fù)制一個字符串*/ /*形參:字符指針str_from接收源串,字符指針 str_to存儲目標(biāo)串 */*返回值:無*/ /*/void string_copy(char *str_from, char *str
31、_to) int i=0; for(; (*(str_to+i)=*(str_from+i)!=0; i+) ; /*循環(huán)體為空語句*/ main() char array_str120=”I am a teacher.”; char array_str220; 6.3.4 指針與字符數(shù)組 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄string_copy(array_str1, array_str2) ; /*數(shù)組名作實參*/printf(“array_str2=%sn”, array_str2); 程序運行結(jié)果: I am a teacher.程序說明: for(; (*
32、(str_to+i)=*(str_from+i)!=0; i+) ; 語句的執(zhí)行過程為:首先將源串中的當(dāng)前字符,復(fù)制到目標(biāo)串中;然后判斷該字符(即賦值表達(dá)式的值)是否是結(jié)束標(biāo)志。如果不是,則相對位置變量i的值增1,以便復(fù)制下一個字符;如果是結(jié)束標(biāo)志,則結(jié)束循環(huán)。其特點是:先復(fù)制、后判斷,循環(huán)結(jié)束前,結(jié)束標(biāo)志已經(jīng)復(fù)制。 6.3.5 數(shù)組指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄 我們上面介紹的指針都是指向某一類型的變量的,例如可以使一個指針p指向某一數(shù)組元素。如果p的值加1,則指向下一個元素,這樣指針在處理一維數(shù)組時非常方便,但在處理二維數(shù)組時就不適合了。如果定義一個指
33、針p,讓它指向一個包含n個元素的一維數(shù)組,且p的增值以一維數(shù)組的長度為單位,此時,如果指針P指向二維數(shù)組的某一行,則p+1就指向了該二維數(shù)組的下一行。在C+中,這樣的指針被稱為數(shù)組指針,使用數(shù)組指針可以很方便地處理二維數(shù)組。 數(shù)組指針的說明形式如下: 存儲類型 數(shù)據(jù)類型 (*指針名)元素個數(shù) 例如,在程序中定義一個數(shù)組指針: int (*p)4; 它表明指針p指向的數(shù)組指針p指向一個一維數(shù)組,p的值就是該一維數(shù)組的首地址。在使用數(shù)組指針時,有兩點一定要注意:(1) *p兩側(cè)的括號一定不要漏掉,如果寫成*p4的形式,由于 的運算級別高,因此p先和4結(jié)合,是數(shù)組,然后再與前面的*結(jié)合,*p4是指針
34、數(shù)組。 6.3.5 數(shù)組指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄(2) p是一個行指針,它只能指向一個包含n個元素的一維數(shù)組,不能指向一維數(shù)組中的元素。【例6.9】:用數(shù)組指針處理二維數(shù)組。程序名為l6_9.cppmain()int a23=1,3,5,7,9,11;int (*p)3;int i,j;p=a;for(i=0;i2;i+) for(j=0;j *num2_p ) /* 即num1num2)*/ exchange(num1_p, num2_p); /*指針變量作實參*/ printf(“min=%d, max=%dn”, num1, num2); /*
35、輸出排序后的num1和num2的值*/程序運行情況:Input the first number:9Input the second number:6num1=9, num2=6min=6, max=9程序說明:形參指針變量pointer1(指向變量num1)和pointer2(指向變量num2),在函數(shù)調(diào)用開始時才分配存儲空間,函數(shù)調(diào)用結(jié)束后立即被釋放。雖然被調(diào)用函數(shù)不能改變實參指針變量的值,但可以改變它們所指向的變量的值。 6.4.2 函數(shù)指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄1.函數(shù)指針的概念 一個函數(shù)在編譯時,被分配了一個入口地址,這個地址就稱為該函數(shù)的指
36、針??梢杂靡粋€指針變量指向一個函數(shù),然后通過該指針變量調(diào)用此函數(shù)?!纠?.11】:求a 和b中的大者。程序名為l6_11.cppmain ( ) int max( ); int (*p)( ); int a,b,c; p=max; scanf (%d,%d”,&a,&b); 6.4.2 函數(shù)指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄c=(*p) (a,b);printf (a= %d,b= %d,max = %d,a,b,c);max (int x,int y)int z;if (xy) z = x;else z=y;return (z)程序說明: 其中int (*p
37、)( )說明p 是一個指向函數(shù)的指針變量,此函數(shù)帶回整型的返回值。注意*p 兩側(cè)的括弧不可省略,表示p 先與*結(jié)合,是指針變量,然后再與后面的()結(jié)合,表示此指針變量指向函數(shù),這個函數(shù)值(即函數(shù)返回的值)是整型的。如果寫成“int *p” ,則由于()優(yōu)先級高于*,它就成了說明一個函數(shù)了,這個函數(shù)的返回值是指向整型變量的指針。 6.4.2 函數(shù)指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄 2.指向函數(shù)的指針變量(1)定義格式 函數(shù)類型 (*指針變量)( ); 注意:“*指針變量”外的括號不能缺,否則成了返回指針值的函數(shù)。 例如,int (*fp)(); /* fp為指向
38、int函數(shù)的指針變量*/(2)賦值 函數(shù)名代表該函數(shù)的入口地址。因此,可用函數(shù)名給指向函數(shù)的指針變量賦值。 指向函數(shù)的指針變量&函數(shù)名; 注意:函數(shù)名后不能帶括號和參數(shù);函數(shù)名前的“&”符號是可選的。(3)調(diào)用格式 (*函數(shù)指針變量)(實參表)(4) 函數(shù)名作實參時,因為要缺省括號和參數(shù),造成編譯器無法判斷它是一個變量還是一個函數(shù),所以必須加以說明。(5) 注意:對指向函數(shù)的指針變量,諸如p+i、p+/p-等運算是沒有意義的。 6.4.2 函數(shù)指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄3.指向函數(shù)的指針變量作函數(shù)參數(shù) 指向函數(shù)的指針變量的常用用途之一,就是將函數(shù)指針作
39、參數(shù),傳遞到其它函數(shù)?!纠?.12】:設(shè)一個函數(shù)process ,在調(diào)用它的時候,每次實現(xiàn)不同的功能。輸入a 和b 兩個數(shù),第一次調(diào)用process時找出a 和b 中大者,第二次找出其中小者,第三次求a 與b 之和。程序如下:程序名為l6_12.cppmain()int max(int,int); /*函數(shù)聲明*/int min(int,int); /*函數(shù)聲明*/int add(int,int); /*函數(shù)聲明*/int a,b;scanf(“%d,%d”,&a,&b);printf(“max=”); 6.4.2 函數(shù)指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄pro
40、cess(a,b,max);printf(“min=”);process(a,b,min);printf(“sum=”);process(a,b,add);max(int x,int y) /*函數(shù)定義*/int z;if(xy) z=x;else z=y;return(z);min(int x,int y) /*函數(shù)定義*/int z;if(xy) z=x; 6.4.2 函數(shù)指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄else z=y;return(z);add(int x,int y) /*函數(shù)定義*/int z;z=x+y;return(z);process(in
41、t x,int y,int(*fun)(int,int) 函數(shù)定義. int(*fun)(int,int)表示fun是指向*/*函數(shù)的指針,該函數(shù)是一個整型函數(shù),有兩個整型形參.*/int result;result=(*fun)(x,y);printf(%dn”,result); 6.4.2 函數(shù)指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄程序運行結(jié)果如下:3,9max=9min=3sum=12程序說明: max、min 和sum 是已定義的三個函數(shù),分別用來實現(xiàn)求大數(shù)、求小數(shù)和求和的功能。在main 函數(shù)中第一次調(diào)用process函數(shù)時,除了將a 和b 作為實參將兩
42、個數(shù)傳給process的形參x 、y 外,還將函數(shù)名max作為實參將其入口地址傳送給process函數(shù)中的形參-指向函數(shù)的指針變量fun,這時,process函數(shù)中的(*fun) ( x , y ) 相當(dāng)于max ( x , y ) ,執(zhí)行process可以輸出a 和b 中大者。在main函數(shù)第二次調(diào)用時,改以函數(shù)名min 作實參,此時process函數(shù)的形參fun 指向函數(shù)min , 在process函數(shù)中的函數(shù)調(diào)用(*fun) ( x , y )相當(dāng)于min ( x , y )。同理,第三次調(diào)用process函數(shù)時,(*fun) ( x , y )相當(dāng)于add ( x , y )。從本例可
43、以清楚地看到,不論執(zhí)行max 、min或add ,函數(shù)process 一點都沒有改動,只是在調(diào)用process函數(shù)時實參函數(shù)名改變而已。這就增加了函數(shù)使用的靈活性。 6.4.3 指針函數(shù) C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄指針函數(shù)是指返回值為指針的函數(shù),函數(shù)的返回值可以是不同類型的指針指針函數(shù)定義格式如下:函數(shù)類型 *函數(shù)名(形參表)例如: int *pr(x,y); pr是函數(shù)名,調(diào)用它以后能得到一個指向整型數(shù)據(jù)的指針(地址)。x 、y 是函數(shù)pr 的形參。請注意在*pr兩側(cè)沒有括弧,在pr的兩側(cè)分別為*運算符和()運算符。而()優(yōu)先級高于*,因此a 先與()結(jié)合
44、。顯然這是函數(shù)形式。這個函數(shù)前面有一個*,表示此函數(shù)是指針型函數(shù)(函數(shù)值是指針)。最前面的int 表示返回的指針指向整型變量。 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本章目錄6.5.2 指針數(shù)組6.5.3 main函數(shù)的參數(shù)6.5.1 多級指針6.5 多級指針與指針數(shù)組6.5.1 多級指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)1.概念 在前面的敘述中,一個指針變量可以指向一個相應(yīng)數(shù)據(jù)類型的數(shù)據(jù),例如: int a,*p; p=&a; 使指針p指向a,則指針p所指向的變量*p就是要處理的數(shù)據(jù)變量a.如果同時存在另一個指針pp,并且把指針p的地址賦予指針變量pp,即:
45、pp=&p; 則pp就指向指針p,這時指針pp所指向的變量*pp就是指針p。在C+中,把pp這樣的指向指針的指針稱為多級指針。返回本節(jié)目錄2.定義格式 數(shù)據(jù)類型 *指針變量, *指針變量2;6.5.1 多級指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄【例6.13】用二級指針處理多個字符串。程序名為l6_13.cppmain ( ) static char * name = Follow me,BASIC,FORTRAN,Great Wall,Computerdesign; char * * p;int i;for(i=0;i5;i+) p=name+i; printf(
46、“%sn”,*p); 程序運行結(jié)果:Follow meBASICFORTRANGreat WallComputerdesign6.5.1 多級指針 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄程序說明:指針數(shù)組的元素也可以不指向字符串,而指向整型數(shù)據(jù)或?qū)嵭蛿?shù)據(jù)等,例如:int a5=l,3,5,7,9 ,int *num5=&a0,&al,&a2,&a3,&a4;int * * p ;此時為了得到數(shù)據(jù)“5 ,可以先使p =num + 2 ,然后輸出* p 。注意*p 是p 間接指向的對象的地址。而*p 是p 間接指向的對象的值。6.5.2 指針數(shù)組 C語言程序設(shè)計 (Visual C+ 6.0環(huán)境) 1.概念 2.定義格式 數(shù)組的每個元素都是一個指針數(shù)據(jù)。 數(shù)據(jù)類型 *數(shù)組名元素個數(shù) 指針數(shù)組常適用于指向若干字符串,這樣使字符串處理更加靈活方便。返回本節(jié)目錄6.5.3 main函數(shù)的參數(shù) C語言程序設(shè)計 (Visual C+ 6.0環(huán)境)返回本節(jié)目錄指針數(shù)組的一個重要應(yīng)用是作為main函數(shù)的形參。在前面講述的程序中,main函數(shù)的第一行全部寫成了以下形式:main ( )括號中為空,表示沒有參數(shù)。實際上main函數(shù)是可以帶參數(shù)的,其一般形式為:main (
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 4年級上冊數(shù)學(xué)人教版說課稿7篇
- 網(wǎng)頁制作案例教程HTML5+CSS3課程設(shè)計
- 《數(shù)理經(jīng)濟學(xué)》課程教學(xué)大綱
- 復(fù)習(xí)真題卷04 第6-7單元(解析版)
- DBJ51-T 198-2022 四川省既有民用建筑結(jié)構(gòu)安全隱患排查技術(shù)標(biāo)準(zhǔn)
- 2009年高考語文試卷(全國Ⅱ卷)(解析卷)
- 建筑工程行業(yè)工程測量培訓(xùn)體會
- 通信行業(yè)客服工作總結(jié)
- 《色彩的漸變》課件
- 有關(guān)醫(yī)院的實習(xí)報告三篇
- 中央2025年全國人大機關(guān)直屬事業(yè)單位招聘18人筆試歷年典型考點(頻考版試卷)附帶答案詳解
- 2024至2030年四氯苯醌項目投資價值分析報告
- 北京市海淀區(qū)2024-2025學(xué)年七年級上學(xué)期期中考試英語試卷(含答案)
- 中資企業(yè)出海報告:潮涌浪闊四海揚帆
- 房地產(chǎn)銷售主管崗位招聘筆試題及解答(某大型央企)2024年
- 2024-2025學(xué)年人教版八年級上冊地理期末測試卷(二)(含答案)
- 80、沈陽桃仙機場二平滑工程冬期施工方案
- 《STM32Cube嵌入式系統(tǒng)應(yīng)用》HAL庫版本習(xí)題及答案
- 一年級數(shù)學(xué)練習(xí)題-20以內(nèi)加減法口算題(4000道)直接打印版
- 2024年度無人機飛行培訓(xùn)合同
- 2025年中國細(xì)胞與基因治療行業(yè)深度分析、投資前景、趨勢預(yù)測報告(智研咨詢)
評論
0/150
提交評論