版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第9章 指 針,指針是語言中的重要概念,也是語言的重要特色。使用指針,可以使程序更加簡潔、緊湊、高效。 9.1 指針和指針變量的概念 9.2 指針變量的定義與應(yīng)用 9.3 數(shù)組的指針和指向數(shù)組的指針變量 9.4 字符串的指針和指向字符串的指針變量 9.5 返回指針值的函數(shù) 9.6 指針數(shù)組與主函數(shù)main()的形參 9.7 函數(shù)的指針和指向函數(shù)的指針變量,9.1 指針和指針變量的概念,1.內(nèi)存地址內(nèi)存中存儲單元的編號 (1)計(jì)算機(jī)硬件系統(tǒng)的內(nèi)存儲器中,擁有大量的存儲單元(容量為字節(jié))。 為了方便管理,必須為每一個存儲單元編號,這個編號就是存儲單元的“地址”。每個存儲單元都有一個惟一的地址。 (
2、2)在地址所標(biāo)識的存儲單元中存放數(shù)據(jù)。 注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個完全不同的概念。 2.變量地址系統(tǒng)分配給變量的內(nèi)存單元的起始地址 假設(shè)有這樣一個程序:,main() int num; scanf(%d,”時,存取變量num值的方式可以有兩種:,(1)直接訪問直接利用變量的地址進(jìn)行存取 1)上例中scanf(“%d”, /*將3直接賦給變量num*/ num_pointer= /*將3賦給指針變量num_pointer所指向的變量*/ Return,9.2 指針變量的定義與應(yīng)用,9.2.1 指針變量的定義與相關(guān)運(yùn)算 案例9.1 指針變量的定義與相關(guān)運(yùn)算示例。 /*案例代碼文件
3、名:AL9_1.C*/ 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= 程序演示,程序運(yùn)行結(jié)果: num_int=12, *p_int=12 num_f=3.14, *p_f=3.14 num_ch=p, *p_ch=p 程序說明: (1)頭三行的變量定義語句指針變量的定義 與一般變量的定義相比,除變量名前多了一個
4、星號“*” (指針變量的定義標(biāo)識符)外,其余一樣: 數(shù)據(jù)類型 *指針變量, *指針變量2; 注意:此時的指針變量p_int、p_f、p_ch,并未指向某個具體的變量(稱指針是懸空的)。使用懸空指針很容易破壞系統(tǒng),導(dǎo)致系統(tǒng)癱瘓。,(2)中間三行的賦值語句取地址運(yùn)算() 取地址運(yùn)算的格式: 變量 例如, int *num1_p= 程序演示,程序運(yùn)行情況: Input the first number:9 Input the second number:6 num1=9, num2=6 min=6, max=9 程序說明: (1)第5行的if語句 如果*num1_p*num2_p (即num1num
5、2),則交換指針,使num1_p指向變量num2(較小值),num2_p指向變量num1(較大值)。 (2)printf(“min=%d, max=%dn”, *num1_p, *num2_p); 語句:通過指針變量,間接訪問變量的值。,本案例的處理思路是:交換指針變量num1_p 和num2_p的值,而不是變量num1和num2的值(變量num1和num2并未交換,仍保持原值),最后通過指針變量輸出處理結(jié)果。 9.2.2 指針變量作函數(shù)參數(shù) 1.指針變量,既可以作為函數(shù)的形參,也可以作函數(shù)的實(shí)參。 2.指針變量作實(shí)參時,與普通變量一樣,也是“值傳遞”,即將指針變量的值(一個地址)傳遞給被調(diào)用
6、函數(shù)的形參(必須是一個指針變量)。 注意:被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指向的變量的值。,案例9.3 使用函數(shù)調(diào)用方式改寫案例9.2,要求實(shí)參為指針變量。 /*案例代碼文件名:AL9_3.C*/*/*exchange()功能:交換2個形參指針變量所指向的變量的值 */*形參:2個,均為指向整型數(shù)據(jù)的指針變量 */*返回值:無 */*/void exchange(int *pointer1, int *pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; /*主函數(shù)main(
7、)*/ main() int num1,num2; /*定義并初始化指針變量num1_p和 num2_p */ int *num1_p=,printf(“Input the first number: ”); scanf(“%d”, num1_p); printf(“Input the second number: ”); scanf(“%d”, num2_p); printf(“num1=%d, num2=%dn”, num1, num2); if( *num1_p *num2_p ) /* 即num1num2)*/ exchange(num1_p, num2_p); /*指針變量作實(shí)參*/
8、 /*輸出排序后的num1和num2的值*/ printf(“min=%d, max=%dn”, num1, num2); 程序演示 程序運(yùn)行情況: Input the first number:9 Input the second number:6 num1=9, num2=6 min=6, max=9,調(diào)用函數(shù)exchange()之前、之時、結(jié)束時和結(jié)束后的情況,如圖9-5所示。 形參指針變量pointer1(指向變量num1)和pointer2(指向變量num2),在函數(shù)調(diào)用開始時才分配存儲空間,函數(shù)調(diào)用結(jié)束后立即被釋放。 雖然被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但可以改變它們所指向的變
9、量的值。 總結(jié):為了利用被調(diào)用函數(shù)改變的變量值,應(yīng)該使用指針(或指針變量)作函數(shù)實(shí)參。其機(jī)制為:在執(zhí)行被調(diào)用函數(shù)時,使形參指針變量所指向的變量的值發(fā)生變化;函數(shù)調(diào)用結(jié)束后,通過不變的實(shí)參指針(或?qū)崊⒅羔樧兞浚⒆兓闹当A粝聛怼?案例9.4 輸入3個整數(shù),按降序(從大到小的順序)輸出。要求使用變量的指針作函數(shù)調(diào)用的實(shí)參來實(shí)現(xiàn)。 /*案例代碼文件名:AL9_4.C*/ /*/ /*exchange()功能:交換2個形參指針變量所指向的變量的值 */ /*形參:2個,均為指向整型數(shù)據(jù)的指針變量 */ /*返回值:無 */ /*/ void exchange(int *pointer1, int *
10、pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; ,/*主函數(shù)main()*/ main() int num1,num2,num3; /*從鍵盤上輸入3個整數(shù)*/ printf(“Input the first number: ”); scanf(“%d”, 程序演示,程序運(yùn)行情況: Input the first number:9 Input the second number:6 Input the third number:12 num1=9, num2=6, num3=12 排序結(jié)果: 12
11、, 9, 6 Return,9.3 數(shù)組的指針和指向數(shù)組的指針變量,9.3.1 概述 1.概念 數(shù)組的指針數(shù)組在內(nèi)存中的起始地址,數(shù)組元素的指針數(shù)組元素在內(nèi)存中的起始地址。 2.指向數(shù)組的指針變量的定義 指向數(shù)組的指針變量的定義,與指向普通變量的指針變量的定義方法一樣。 例如,int array10, *pointer=array(或 注意:數(shù)組名代表數(shù)組在內(nèi)存中的起始地址(與第1個元素的地址相同),所以可以用數(shù)組名給指針變量賦值。,3.數(shù)組元素的引用 數(shù)組元素的引用,既可用下標(biāo)法,也可用指針法。使用下標(biāo)法,直觀;而使用指針法,能使目標(biāo)程序占用內(nèi)存少、運(yùn)行速度快。 9.3.2 通過指針引用數(shù)組
12、元素 如果有“int array10,*pointer=array;” ,則: (1)pointer+i和array+i都是數(shù)組元素arrayi的地址,如圖9-6所示。 (2)*(pointer+i)和*(array+i)就是數(shù)組元素arrayi。 (3)指向數(shù)組的指針變量,也可將其看作是數(shù)組名,因而可按下標(biāo)法來使用。例如,pointeri等價于*(pointer+i)。 注意:pointer+1指向數(shù)組的下一個元素,而不是簡單地使指針變量pointer的值+1。其實(shí)際變化為pointer+1*size(size為一個元素占用的字節(jié)數(shù))。 例如,假設(shè)指針變量pointer的當(dāng)前值為3000,則
13、pointer+1為3000+1*2=3002,而不是3001。,案例9.5 使用指向數(shù)組的指針變量來引用數(shù)組元素。 /*案例代碼文件名:AL9_5.C*/ /*程序功能:使用指向數(shù)組的指針變量來引用數(shù)組元素*/ main() int array10, *pointer=array, i; printf(“Input 10 numbers: ”); for(i=0; i10; i+) scanf(“%d”, pointer+i);/*使用指針變量來輸入數(shù)組元素的值*/ printf(“array10: ”); for(i=0; i10; i+) printf(“%d ”, *(pointer+
14、i);/*使用指向數(shù)組的指針變量輸出數(shù)組*/ printf(“n”); 程序演示 程序運(yùn)行情況: Input 10 numbers: 0 1 2 3 4 5 6 7 8 9 array10: 0 1 2 3 4 5 6 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”,
15、*pointer); 思考題: (1)如果去掉“pointer=array;”行,程序運(yùn)行結(jié)果會如何?請上機(jī)驗(yàn)證。 (2)在本案例中,也可以不使用i來作循環(huán)控制變量,程序怎么修改?提示:指針可以參與關(guān)系運(yùn)算。,說明: (1)指針變量的值是可以改變的,所以必須注意其當(dāng)前值,否則容易出錯。 (2)指向數(shù)組的指針變量,可以指向數(shù)組以后的內(nèi)存單元,雖然沒有實(shí)際意義。 (3)對指向數(shù)組的指針變量(px和py)進(jìn)行算術(shù)運(yùn)算和關(guān)系運(yùn)算的含義 1)可以進(jìn)行的算術(shù)運(yùn)算,只有以下幾種: pxn, px+/+px, px-/-px, px-py pxn:將指針從當(dāng)前位置向前(+n)或回退(-n)n個數(shù)據(jù)單位,而不是
16、n個字節(jié)。顯然,px+/+px和px-/-px是pxn的特例(n=1)。 px-py:兩指針之間的數(shù)據(jù)個數(shù),而不是指針的地址之差。,2)關(guān)系運(yùn)算 表示兩個指針?biāo)傅刂分g、位置的前后關(guān)系:前者為小,后者為大。 例如,如果指針px所指地址在指針py所指地址之前,則pxpy的值為1。 9.3.3 再論數(shù)組作函數(shù)參數(shù) 數(shù)組名作形參時,接收實(shí)參數(shù)組的起始地址;作實(shí)參時,將數(shù)組的起始地址傳遞給形參數(shù)組。 引入指向數(shù)組的指針變量后,數(shù)組及指向數(shù)組的指針變量作函數(shù)參數(shù)時,可有種等價形式(本質(zhì)上是一種,即指針數(shù)據(jù)作函數(shù)參數(shù)): (1)形參、實(shí)參都用數(shù)組名 (2)形參、實(shí)參都用指針變量 (3)形參用指針變量、實(shí)
17、參用數(shù)組名 (4)形參用數(shù)組名、實(shí)參用指針變量,9.3.4 2維數(shù)組的指針及其指針變量 1. 2維數(shù)組的指針 假設(shè)有如下數(shù)組定義語句: int array34; (1)從2維數(shù)組角度看,數(shù)組名array代表數(shù)組的起始地址, 是一個以行為單位進(jìn)行控制的行指針: array+i:行指針值,指向2維數(shù)組的第i行。 *(array+i):(列)指針值,指向第i行第列(控制由行轉(zhuǎn)為列,但仍為指針)。 *(*(array+i):數(shù)組元素arrayi0的值。 用array作指針訪問數(shù)組元素arrayij的格式: *(*(array+i)j) 注意:行指針是一個級指針,如圖9-7所示。 (2)從1維數(shù)組角度看
18、,數(shù)組名array和第1維下標(biāo)的每一個值, 共同構(gòu)成一組新的1維數(shù)組名array0、array1、array2,它們均由4個元素組成。,語言規(guī)定:數(shù)組名代表數(shù)組的地址,所以arrayi是第i行1維數(shù)組的地址, 它指向該行的第0列元素,是一個以數(shù)組元素為單位進(jìn)行控制的列指針: arrayi+j:(列)指針值,指向數(shù)組元素arrayij。 *(arrayi+j):數(shù)組元素arrayij的值。 如果有“int array34,*p=array0;”,則p+1指向下一個元素,如圖9-8所示。 用p作指針訪問數(shù)組元素arrayij的格式: *(p+(*每行列數(shù)+j) ) 2.行指針變量指向由n個元素組成
19、的一維數(shù)組的指針變量 (1)定義格式 數(shù)據(jù)類型 (*指針變量)n;,注意:“*指針變量”外的括號不能缺,否則成了指針數(shù)組數(shù)組的每個元素都是一個指針指針數(shù)組(本章第6節(jié)介紹)。 (2)賦值 行指針變量 2維數(shù)組名 | 行指針變量; 案例9.6 使用行指針和列指針兩種方式輸出2維數(shù)組的任一元素。 (1) 使用行指針 /*案例代碼文件名:AL9_6_1.C*/ /*程序功能:使用行指針輸出2維數(shù)組的任一元素*/ main() int array34=1,2,3,4,5,6,7,8,9,10,11,12; int (*pointer)4, row, col; pointer=array; printf
20、(“Input row = ”); scanf(“%d”, ,printf(“array%1d%1d = %dn”, row, col, *(*(pointer+row)+col); 程序演示 程序運(yùn)行情況: Input row = 1 Input col = 2 array12 = 7 思考題:本題也可以直接使用數(shù)組名array作指針,應(yīng)如何修改? (2)使用列指針 /*案例代碼文件名:AL9_6_2.C*/ /*程序功能:使用列指針輸出2維數(shù)組的任一元素*/ main() int array34=1,2,3,4,5,6,7,8,9,10,11,12; int *pointer, row,
21、col; /*定義一個(列)指針變量pointer*/ pointer=array0; /*給(列)指針變量pointer賦值*/ printf(“Input row = ”); scanf(“%d”, 程序演示,3. 2維數(shù)組指針作函數(shù)參數(shù) 2維數(shù)組的指針作函數(shù)實(shí)參時,有列指針和行指針兩種形式。相應(yīng)的,用來接受實(shí)參數(shù)組指針的形參,必須使用相應(yīng)形式的指針變量,如下所示: 實(shí)參: 列指針 行指針 形參: (列)指針變量 行指針變量 9.3.5 動態(tài)數(shù)組的實(shí)現(xiàn) 在程序運(yùn)行過程中,數(shù)組的大小是不能改變的。這種數(shù)組稱為靜態(tài)數(shù)組。靜態(tài)數(shù)組的缺點(diǎn)是:對于事先無法準(zhǔn)確估計(jì)數(shù)據(jù)量的情況,無法做到既滿足處理需要
22、,又不浪費(fèi)內(nèi)存空間。 所謂動態(tài)數(shù)組是指,在程序運(yùn)行過程中,根據(jù)實(shí)際需要指定數(shù)組的大小。 在C語言中,可利用內(nèi)存的申請和釋放庫函數(shù),以及指向數(shù)組的指針變量可當(dāng)數(shù)組名使用的特點(diǎn),來實(shí)現(xiàn)動態(tài)數(shù)組。,動態(tài)數(shù)組的本質(zhì)是:一個指向數(shù)組的指針變量。 案例9.7 動態(tài)數(shù)組的實(shí)現(xiàn)。 /*案例代碼文件名:AL9_7.C*/ /*程序功能:實(shí)現(xiàn)動態(tài)數(shù)組*/ #include “alloc.h” #include “stdlib.h” main() int *array=NULL, num, i; printf(“Input the number of element: ”); scanf(“%d”, /*exit(
23、):終止程序運(yùn)行,返回操作系統(tǒng)*/ ,/*提示輸入num個數(shù)據(jù)*/ printf(“Input %d elements: ”, num); for (i=0; inum; i+) scanf(“%d”, /*釋放由malloc()函數(shù)申請的內(nèi)存塊*/ 程序演示 程序運(yùn)行情況: Input the number of element: 3 Input 3 elements: 1 2 3 3 elements are: 1,2,3,程序說明: (1) array=(int *)malloc( sizeof(int) * num );語句malloc()函數(shù)和sizeof運(yùn)算符 1)庫函數(shù)mallo
24、c() 用法:void *malloc(unsigned size) 功能:在內(nèi)存的動態(tài)存儲區(qū)分配個長度為size的連續(xù)空間。 返回值:申請成功,則返回新分配內(nèi)存塊的起始地址;否則,返回NULL。 函數(shù)原型:alloc.h,stdlib.h。 malloc()函數(shù)的返回值是一個無類型指針,其特點(diǎn)是可以指向任何類型的數(shù)據(jù)。但在實(shí)際使用malloc()函數(shù)時,必須將其返回值強(qiáng)制轉(zhuǎn)換成被賦值指針變量的數(shù)據(jù)類型,以免出錯。 2)運(yùn)算符sizeof 格式:sizeof(變量名類型名) 功能:求變量類型占用的內(nèi)存字節(jié)數(shù)(正整數(shù))。例如,在IBM-PC機(jī)上,sizeof(int)=2。,思考題:在該語句中,
25、使用sizeof(int)求出1個int型數(shù)據(jù)占用的內(nèi)存字節(jié)數(shù),而不是使用常量“2”,為什么? (2) scanf(“%d”, 語句 “b” 在該語句中的作用是,使光標(biāo)定位到最后一個數(shù)據(jù)后的分隔符“,”上,然后再輸出一個空格,以達(dá)到刪除之目的。,(4) free(array);語句庫函數(shù)free() 用法:void free(void *ptr) 功能:釋放由ptr指向的內(nèi)存塊(ptr是調(diào)用malloc() 函數(shù)的返回值)。 返回值:無。 函數(shù)原型:stdlib.h,alloc.h。 原則上,使用malloc()函數(shù)申請的內(nèi)存塊,操作結(jié)束后,應(yīng)及時使用free()函數(shù)予以釋放。尤其是循環(huán)使用m
26、alloc()函數(shù)時,如果不及時釋放不再使用的內(nèi)存塊,很可能很快就耗盡系統(tǒng)的內(nèi)存資源,從而導(dǎo)致程序無法繼續(xù)運(yùn)行。 Return,9.4 字符串的指針和指向字符串的指針變量,字符串在內(nèi)存中的起始地址稱為字符串的指針,可以定義一個字符指針變量指向一個字符串。 9.4.1 字符串的表示與引用 在語言中,既可以用字符數(shù)組表示字符串,也可用字符指針變量來表示;引用時,既可以逐個字符引用,也可以整體引用。 1.逐個引用 案例9.8 使用字符指針變量表示和引用字符串。 /*案例代碼文件名:AL9_8.C*/ main() char *string=”I love Beijing.”; for(; *stri
27、ng!=0; string+) printf(“%c”, *string); printf(“n”); 程序演示,程序運(yùn)行結(jié)果: I love Beijing. 程序說明:char *string=I love Beijing.;語句 定義并初始化字符指針變量string:用串常量“I love Beijing.”的地址(由系統(tǒng)自動開辟、存儲串常量的內(nèi)存塊的首地址)給string賦初值。 該語句也可分成如下所示的兩條語句: char *string; string=I love Beijing.; 注意:字符指針變量string中,僅存儲串常量的地址,而串常量的內(nèi)容(即字符串本身),是存儲在由
28、系統(tǒng)自動開辟的內(nèi)存塊中,并在串尾添加一個結(jié)束標(biāo)志0。,2.整體引用 案例9.9 采取整體引用的辦法,改寫案例9.8。 /*案例代碼文件名:AL9_9.C*/ /*程序功能:使用字符指針變量表示和引用字符串*/ main() char *string=”I love Beijing.”; printf(“%sn”,string); 程序演示 程序說明:printf(%sn,string);語句 通過指向字符串的指針變量string,整體引用它所指向的字符串的原理:系統(tǒng)首先輸出string指向的第一個字符,然后使string自動加,使之指向下一個字符;重復(fù)上述過程,直至遇到字符串結(jié)束標(biāo)志。,注意:
29、其它類型的數(shù)組,是不能用數(shù)組名來一次性輸出它的全部元素的,只能逐個元素輸出。 例如: int array10=; . printf(%dn,array); /*這種用法是非法的*/ . 3.字符指針變量與字符數(shù)組之比較 雖然用字符指針變量和字符數(shù)組都能實(shí)現(xiàn)字符串的存儲和處理,但二者是有區(qū)別的,不能混為一談。 (1)存儲內(nèi)容不同。 字符指針變量中存儲的是字符串的首地址,而字符數(shù)組中存儲的是字符串本身(數(shù)組的每個元素存放一個字符)。,(2)賦值方式不同。 對字符指針變量,可采用下面的賦值語句賦值: char *pointer; pointer=This is a example.; 而字符數(shù)組,雖
30、然可以在定義時初始化,但不能用賦值語句整體賦值。下面的用法是非法的: char char_array20; char_array=This is a example.; /*非法用法*/ (3)指針變量的值是可以改變的,字符指針變量也不例外;而數(shù)組名代表數(shù)組的起始地址,是一個常量,而常量是不能被改變的。 9.4.2 字符串指針作函數(shù)參數(shù),案例9.10 用函數(shù)調(diào)用方式,實(shí)現(xiàn)字符串的復(fù)制。 /*案例代碼文件名:AL9_10.C*/ /*/ /*string_copy()函數(shù):復(fù)制一個字符串 */ /*形參:字符指針str_from接收源串,字符指針 str_to存儲目標(biāo)串 */ /*返回值:無 *
31、/ /*/ void string_copy(char *str_from, char *str_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; string_copy(array_str1, array_str2); /*數(shù)組名作實(shí)參*/ printf(“array_str2=%sn”, array_str2); 程序演示,程序運(yùn)行結(jié)果: I am a teacher. 程序說明:
32、for(; (*(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)。其特點(diǎn)是:先復(fù)制、后判斷,循環(huán)結(jié)束前,結(jié)束標(biāo)志已經(jīng)復(fù)制。 在C語言中,用賦值運(yùn)算符、而不是賦值語句來實(shí)現(xiàn)賦值操作,能給某些處理帶來很大的靈活性,該語句(實(shí)現(xiàn)字符串的復(fù)制)的用法就是最好的例證。 Return,9.5 返回指針值的函數(shù),一個函數(shù)可以返回一個int型、float型、char型的數(shù)據(jù),也可以返回一個指針類型的數(shù)
33、據(jù)。 返回指針值的函數(shù)(簡稱指針函數(shù))的定義格式如下: 函數(shù)類型 *函數(shù)名(形參表) 案例9.11 某數(shù)理化三項(xiàng)競賽訓(xùn)練組有3個人,找出其中至少有一項(xiàng)成績不合格者。要求使用指針函數(shù)實(shí)現(xiàn)。/*案例代碼文件名:AL9_11.C*/*/*seek()函數(shù):判斷是否有不合格成績 */*形參:指向由3個int型元素組成的1維數(shù)組的行指針變量 */*返回值:(1)有不合格成績,則返回指向本行首列的一個(列)指針; */* (2)沒有有不合格成績,返回值為指向下一行的一個(列)指針 */*/,int *seek( int (*pnt_row)3 ) int i=0, *pnt_col; /*定義一個(列)指
34、針變量pnt_col */ pnt_col=*(pnt_row+1); /*使pnt_col指向下一行之首(作標(biāo)志用)*/ for(; i3; i+) if(*(*pnt_row+i)60) /*某項(xiàng)成績不合格*/ pnt_col=*pnt_row; /*使pnt_col指向本行之首*/ break; /*退出循環(huán)*/ return(pnt_col); ,/*主函數(shù)main()*/ main() int grade33=55,65,75,65,75,85,75,80,90; int i,j,*pointer; /*定義一個(列)指針變量pointer */ for(i=0; i3; i+) /
35、*控制每個學(xué)生*/ pointer=seek(grade+i); /*用行指針作實(shí)參,調(diào)用seek()函數(shù)*/ if(pointer=*(grade+i) /*該學(xué)生至少有一項(xiàng)成績不合格*/ /*輸出該學(xué)生的序號和各項(xiàng)成績*/ printf(“No.%d grade list: ”, i+1); for(j=0; j3; j+) printf(“%d ”,*(pointer+j); printf(“n”); 程序演示 程序運(yùn)行結(jié)果: No.1 grade list: 55 65 75,程序說明: (1) 主函數(shù)中的pointer=seek(grade+i);語句 調(diào)用seek()函數(shù)時,將實(shí)參
36、grade+i(行指針)的值,復(fù)制到形參pnt_row(行指針變量)中,使形參pnt_row指向grade數(shù)組的第i行。 (2)在指針函數(shù)seek()中: 1) pnt_col=*(pnt_row+1);語句 *(pnt_row+1)將行指針轉(zhuǎn)換為列指針,指向grade數(shù)組的第i+1行第列,并賦值給(列)指針變量pnt_col。 2) if(*(*pnt_row+i)60)行 pnt_row是一個行指針,指向數(shù)組grade的第i行;*pnt_row使指針由行轉(zhuǎn)換為列,指向數(shù)組grade的第i行列;*pnt_row+j的值還是一個指針,指向數(shù)組的第i行第j列;*(*pnt_rowj)是一個數(shù)據(jù)(
37、數(shù)組元素gradeij的值)。 Return,9.6 指針數(shù)組與主函數(shù)main()的形參,9.6.1 指針數(shù)組 1.概念 數(shù)組的每個元素都是一個指針數(shù)據(jù)。指針數(shù)組比較適合用于指向多個字符串,使字符串處理更加方便、靈活。 2.定義格式 數(shù)據(jù)類型 *數(shù)組名元素個數(shù) 注意:與行指針變量定義格式“(*行指針變量)”的差別。 案例9.12 有若干計(jì)算機(jī)圖書,請按字母順序,從小到大輸出書名。解題要求:使用排序函數(shù)完成排序,在主函數(shù)中進(jìn)行輸入輸出。/*案例代碼文件名:AL9_12.C*/*程序功能:指針數(shù)組應(yīng)用示例*/,/*/ /* sort()函數(shù):對字符指針數(shù)組進(jìn)行排序 */ /*形參:name字符指針
38、數(shù)組,count元素個數(shù)*/ /*返回值:無 */ /*/ void sort(char *name, int count) char *temp_p; int i,j,min; /*使用選擇法排序*/ for(i=0; i0) /*存在更小的串*/ min=j; /*保存之*/ if(min!=i) /*存在更小的串,交換位置*/ temp_p=namei,namei=namemin,namemin=temp_p; ,/*主函數(shù)main()*/ main() char *name5=“BASIC”,”FORTRAN”,”PASCAL”,”C”,”FoxBASE”; int i=0; sort
39、(name,5); /*使用字符指針數(shù)組名作實(shí)參,調(diào)用排序函數(shù)sort()*/ /*輸出排序結(jié)果*/ for(; i5; i+) printf(“%sn”,namei); 程序演示 程序運(yùn)行結(jié)果: BASIC C FORTRAN FoxBASE PASCAL,程序說明: (1)實(shí)參對形參的值傳遞: sort( name , 5 ); void sort(char *name, int count) (2)字符串的比較只能使用strcmp()函數(shù)。形參字符指針數(shù)組name的每個元素,都是一個指向字符串的指針,所以有strcmp(namemin,namej)。 9.6.2 主函數(shù)main()的形參
40、 在以往的程序中,主函數(shù)main()都使用其無參形式。實(shí)際上,主函數(shù)main()也是可以指定形參的。 案例9.13 用同一程序?qū)崿F(xiàn)文件的加密和解密。約定:程序的可執(zhí)行文件名為lock.exe, 其用法為:lock +|- ,其中“+”為加密,“-”為解密。 /*案例代碼文件名:AL9_13.C*/ /*程序功能:帶參主函數(shù)的應(yīng)用示例*/,main(int argc, char *argv) char c; if (argc != 3) printf(參數(shù)個數(shù)不對!n); else c=*argv1;/*截取第二個實(shí)參字符串的第一個字符*/ switch(c) case +: /*執(zhí)行加密*/ /*加密程序
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44554.9-2025電子憑證入賬要求第9部分:國庫集中支付電子憑證
- 2026上海復(fù)旦大學(xué)國家智能評價與治理實(shí)驗(yàn)基地趙星課題組招聘博士后2人考試參考試題及答案解析
- 2026北京市延慶區(qū)教育委員會第一批招聘教師60人考試參考試題及答案解析
- 2026山東青島水務(wù)集團(tuán)有限公司招聘1人考試備考試題及答案解析
- 2026四川內(nèi)江市隆昌市普潤鎮(zhèn)中心學(xué)校招聘2人考試備考試題及答案解析
- 2026廣西農(nóng)業(yè)科學(xué)院甘蔗研究所甘蔗綠色高效栽培技術(shù)團(tuán)隊(duì)招聘編制外工作人員1人考試參考試題及答案解析
- 2026年甘肅省金昌市機(jī)關(guān)事務(wù)管理局補(bǔ)招臨聘駕駛員筆試參考題庫及答案解析
- 2025浙江省旅游投資集團(tuán)招聘25人(第八批)考試備考試題及答案解析
- 2026廣東中山大學(xué)附屬第一醫(yī)院精準(zhǔn)醫(yī)學(xué)研究院消化系統(tǒng)腫瘤研究團(tuán)隊(duì)專職科研人員招聘2人考試參考題庫及答案解析
- 2026廣東深圳市福田區(qū)黃埔雅苑幼兒園招聘教職員工1人考試參考題庫及答案解析
- 2025年教師師德師風(fēng)自查問題清單及整改措施范文
- DL-T5796-2019水電工程邊坡安全監(jiān)測技術(shù)規(guī)范
- 2023年副主任醫(yī)師(副高)-推拿學(xué)(副高)考試歷年高頻考點(diǎn)真題演練附帶含答案
- 產(chǎn)品質(zhì)量法課件
- FZ/T 82006-2018機(jī)織配飾品
- 《食品包裝學(xué)(第三版)》教學(xué)PPT課件整套電子講義
- plc電機(jī)正反轉(zhuǎn)-教案
- 燃機(jī)三菱控制系統(tǒng)簡述課件
- 全尺寸測量報告FAI
- 稽核管理培訓(xùn)課件
- 臨時電箱日常巡查記錄表
評論
0/150
提交評論