




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第9章 指 針,指針是語言中的重要概念,也是語言的重要特色。使用指針,可以使程序更加簡潔、緊湊、高效。 9.1 指針和指針變量的概念 9.2 指針變量的定義與應用 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)計算機硬件系統(tǒng)的內(nèi)存儲器中,擁有大量的存儲單元(容量為字節(jié))。 為了方便管理,必須為每一個存儲單元編號,這個編號就是存儲單元的“地址”。每個存儲單元都有一個惟一的地址。 (
2、2)在地址所標識的存儲單元中存放數(shù)據(jù)。 注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個完全不同的概念。 2.變量地址系統(tǒng)分配給變量的內(nèi)存單元的起始地址 假設有這樣一個程序:,main() int num; scanf(%d,”時,存取變量num值的方式可以有兩種:,(1)直接訪問直接利用變量的地址進行存取 1)上例中scanf(“%d”, /*將3直接賦給變量num*/ num_pointer= /*將3賦給指針變量num_pointer所指向的變量*/ Return,9.2 指針變量的定義與應用,9.2.1 指針變量的定義與相關運算 案例9.1 指針變量的定義與相關運算示例。 /*案例代碼文件
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= 程序演示,程序運行結(jié)果: num_int=12, *p_int=12 num_f=3.14, *p_f=3.14 num_ch=p, *p_ch=p 程序說明: (1)頭三行的變量定義語句指針變量的定義 與一般變量的定義相比,除變量名前多了一個
4、星號“*” (指針變量的定義標識符)外,其余一樣: 數(shù)據(jù)類型 *指針變量, *指針變量2; 注意:此時的指針變量p_int、p_f、p_ch,并未指向某個具體的變量(稱指針是懸空的)。使用懸空指針很容易破壞系統(tǒng),導致系統(tǒng)癱瘓。,(2)中間三行的賦值語句取地址運算() 取地址運算的格式: 變量 例如, int *num1_p= 程序演示,程序運行情況: 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ù)的實參。 2.指針變量作實參時,與普通變量一樣,也是“值傳遞”,即將指針變量的值(一個地址)傳遞給被調(diào)用
6、函數(shù)的形參(必須是一個指針變量)。 注意:被調(diào)用函數(shù)不能改變實參指針變量的值,但可以改變實參指針變量所指向的變量的值。,案例9.3 使用函數(shù)調(diào)用方式改寫案例9.2,要求實參為指針變量。 /*案例代碼文件名: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); /*指針變量作實參*/
8、 /*輸出排序后的num1和num2的值*/ printf(“min=%d, max=%dn”, num1, num2); 程序演示 程序運行情況: 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ù)不能改變實參指針變量的值,但可以改變它們所指向的變
9、量的值。 總結(jié):為了利用被調(diào)用函數(shù)改變的變量值,應該使用指針(或指針變量)作函數(shù)實參。其機制為:在執(zhí)行被調(diào)用函數(shù)時,使形參指針變量所指向的變量的值發(fā)生變化;函數(shù)調(diào)用結(jié)束后,通過不變的實參指針(或?qū)崊⒅羔樧兞浚⒆兓闹当A粝聛怼?案例9.4 輸入3個整數(shù),按降序(從大到小的順序)輸出。要求使用變量的指針作函數(shù)調(diào)用的實參來實現(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”, 程序演示,程序運行情況: 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ù)組元素的引用,既可用下標法,也可用指針法。使用下標法,直觀;而使用指針法,能使目標程序占用內(nèi)存少、運行速度快。 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ù)組名,因而可按下標法來使用。例如,pointeri等價于*(pointer+i)。 注意:pointer+1指向數(shù)組的下一個元素,而不是簡單地使指針變量pointer的值+1。其實際變化為pointer+1*size(size為一個元素占用的字節(jié)數(shù))。 例如,假設指針變量pointer的當前值為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”); 程序演示 程序運行情況: 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;”行,程序運行結(jié)果會如何?請上機驗證。 (2)在本案例中,也可以不使用i來作循環(huán)控制變量,程序怎么修改?提示:指針可以參與關系運算。,說明: (1)指針變量的值是可以改變的,所以必須注意其當前值,否則容易出錯。 (2)指向數(shù)組的指針變量,可以指向數(shù)組以后的內(nèi)存單元,雖然沒有實際意義。 (3)對指向數(shù)組的指針變量(px和py)進行算術運算和關系運算的含義 1)可以進行的算術運算,只有以下幾種: pxn, px+/+px, px-/-px, px-py pxn:將指針從當前位置向前(+n)或回退(-n)n個數(shù)據(jù)單位,而不是
16、n個字節(jié)。顯然,px+/+px和px-/-px是pxn的特例(n=1)。 px-py:兩指針之間的數(shù)據(jù)個數(shù),而不是指針的地址之差。,2)關系運算 表示兩個指針所指地址之間、位置的前后關系:前者為小,后者為大。 例如,如果指針px所指地址在指針py所指地址之前,則pxpy的值為1。 9.3.3 再論數(shù)組作函數(shù)參數(shù) 數(shù)組名作形參時,接收實參數(shù)組的起始地址;作實參時,將數(shù)組的起始地址傳遞給形參數(shù)組。 引入指向數(shù)組的指針變量后,數(shù)組及指向數(shù)組的指針變量作函數(shù)參數(shù)時,可有種等價形式(本質(zhì)上是一種,即指針數(shù)據(jù)作函數(shù)參數(shù)): (1)形參、實參都用數(shù)組名 (2)形參、實參都用指針變量 (3)形參用指針變量、實
17、參用數(shù)組名 (4)形參用數(shù)組名、實參用指針變量,9.3.4 2維數(shù)組的指針及其指針變量 1. 2維數(shù)組的指針 假設有如下數(shù)組定義語句: int array34; (1)從2維數(shù)組角度看,數(shù)組名array代表數(shù)組的起始地址, 是一個以行為單位進行控制的行指針: 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維下標的每一個值, 共同構(gòu)成一組新的1維數(shù)組名array0、array1、array2,它們均由4個元素組成。,語言規(guī)定:數(shù)組名代表數(shù)組的地址,所以arrayi是第i行1維數(shù)組的地址, 它指向該行的第0列元素,是一個以數(shù)組元素為單位進行控制的列指針: 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); 程序演示 程序運行情況: Input row = 1 Input col = 2 array12 = 7 思考題:本題也可以直接使用數(shù)組名array作指針,應如何修改? (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ù)組指針的形參,必須使用相應形式的指針變量,如下所示: 實參: 列指針 行指針 形參: (列)指針變量 行指針變量 9.3.5 動態(tài)數(shù)組的實現(xiàn) 在程序運行過程中,數(shù)組的大小是不能改變的。這種數(shù)組稱為靜態(tài)數(shù)組。靜態(tài)數(shù)組的缺點是:對于事先無法準確估計數(shù)據(jù)量的情況,無法做到既滿足處理需要
22、,又不浪費內(nèi)存空間。 所謂動態(tài)數(shù)組是指,在程序運行過程中,根據(jù)實際需要指定數(shù)組的大小。 在C語言中,可利用內(nèi)存的申請和釋放庫函數(shù),以及指向數(shù)組的指針變量可當數(shù)組名使用的特點,來實現(xiàn)動態(tài)數(shù)組。,動態(tài)數(shù)組的本質(zhì)是:一個指向數(shù)組的指針變量。 案例9.7 動態(tài)數(shù)組的實現(xiàn)。 /*案例代碼文件名:AL9_7.C*/ /*程序功能:實現(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、):終止程序運行,返回操作系統(tǒng)*/ ,/*提示輸入num個數(shù)據(jù)*/ printf(“Input %d elements: ”, num); for (i=0; inum; i+) scanf(“%d”, /*釋放由malloc()函數(shù)申請的內(nèi)存塊*/ 程序演示 程序運行情況: 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運算符 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ù)的返回值是一個無類型指針,其特點是可以指向任何類型的數(shù)據(jù)。但在實際使用malloc()函數(shù)時,必須將其返回值強制轉(zhuǎn)換成被賦值指針變量的數(shù)據(jù)類型,以免出錯。 2)運算符sizeof 格式:sizeof(變量名類型名) 功能:求變量類型占用的內(nèi)存字節(jié)數(shù)(正整數(shù))。例如,在IBM-PC機上,sizeof(int)=2。,思考題:在該語句中,
25、使用sizeof(int)求出1個int型數(shù)據(jù)占用的內(nèi)存字節(jié)數(shù),而不是使用常量“2”,為什么? (2) scanf(“%d”, 語句 “b” 在該語句中的作用是,使光標定位到最后一個數(shù)據(jù)后的分隔符“,”上,然后再輸出一個空格,以達到刪除之目的。,(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é)束后,應及時使用free()函數(shù)予以釋放。尤其是循環(huán)使用m
26、alloc()函數(shù)時,如果不及時釋放不再使用的內(nèi)存塊,很可能很快就耗盡系統(tǒng)的內(nèi)存資源,從而導致程序無法繼續(xù)運行。 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”); 程序演示,程序運行結(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é)束標志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自動加,使之指向下一個字符;重復上述過程,直至遇到字符串結(jié)束標志。,注意:
29、其它類型的數(shù)組,是不能用數(shù)組名來一次性輸出它的全部元素的,只能逐個元素輸出。 例如: int array10=; . printf(%dn,array); /*這種用法是非法的*/ . 3.字符指針變量與字符數(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)用方式,實現(xiàn)字符串的復制。 /*案例代碼文件名:AL9_10.C*/ /*/ /*string_copy()函數(shù):復制一個字符串 */ /*形參:字符指針str_from接收源串,字符指針 str_to存儲目標串 */ /*返回值:無 *
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ù)組名作實參*/ printf(“array_str2=%sn”, array_str2); 程序演示,程序運行結(jié)果: I am a teacher. 程序說明:
32、for(; (*(str_to+i)=*(str_from+i)!=0; i+) ; 語句的執(zhí)行過程為:首先將源串中的當前字符,復制到目標串中;然后判斷該字符(即賦值表達式的值)是否是結(jié)束標志。如果不是,則相對位置變量i的值增1,以便復制下一個字符;如果是結(jié)束標志,則結(jié)束循環(huán)。其特點是:先復制、后判斷,循環(huán)結(jié)束前,結(jié)束標志已經(jīng)復制。 在C語言中,用賦值運算符、而不是賦值語句來實現(xiàn)賦值操作,能給某些處理帶來很大的靈活性,該語句(實現(xiàn)字符串的復制)的用法就是最好的例證。 Return,9.5 返回指針值的函數(shù),一個函數(shù)可以返回一個int型、float型、char型的數(shù)據(jù),也可以返回一個指針類型的數(shù)
33、據(jù)。 返回指針值的函數(shù)(簡稱指針函數(shù))的定義格式如下: 函數(shù)類型 *函數(shù)名(形參表) 案例9.11 某數(shù)理化三項競賽訓練組有3個人,找出其中至少有一項成績不合格者。要求使用指針函數(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指向下一行之首(作標志用)*/ for(; i3; i+) if(*(*pnt_row+i)60) /*某項成績不合格*/ 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、*控制每個學生*/ pointer=seek(grade+i); /*用行指針作實參,調(diào)用seek()函數(shù)*/ if(pointer=*(grade+i) /*該學生至少有一項成績不合格*/ /*輸出該學生的序號和各項成績*/ printf(“No.%d grade list: ”, i+1); for(j=0; j3; j+) printf(“%d ”,*(pointer+j); printf(“n”); 程序演示 程序運行結(jié)果: No.1 grade list: 55 65 75,程序說明: (1) 主函數(shù)中的pointer=seek(grade+i);語句 調(diào)用seek()函數(shù)時,將實參
36、grade+i(行指針)的值,復制到形參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 有若干計算機圖書,請按字母順序,從小到大輸出書名。解題要求:使用排序函數(shù)完成排序,在主函數(shù)中進行輸入輸出。/*案例代碼文件名:AL9_12.C*/*程序功能:指針數(shù)組應用示例*/,/*/ /* sort()函數(shù):對字符指針數(shù)組進行排序 */ /*形參: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ù)組名作實參,調(diào)用排序函數(shù)sort()*/ /*輸出排序結(jié)果*/ for(; i5; i+) printf(“%sn”,namei); 程序演示 程序運行結(jié)果: BASIC C FORTRAN FoxBASE PASCAL,程序說明: (1)實參對形參的值傳遞: 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ù)main()也是可以指定形參的。 案例9.13 用同一程序?qū)崿F(xiàn)文件的加密和解密。約定:程序的可執(zhí)行文件名為lock.exe, 其用法為:lock +|- ,其中“+”為加密,“-”為解密。 /*案例代碼文件名:AL9_13.C*/ /*程序功能:帶參主函數(shù)的應用示例*/,main(int argc, char *argv) char c; if (argc != 3) printf(參數(shù)個數(shù)不對!n); else c=*argv1;/*截取第二個實參字符串的第一個字符*/ switch(c) case +: /*執(zhí)行加密*/ /*加密程序
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)學研合作中的知識產(chǎn)權管理與保護策略
- 福建省泉州市永春縣2024-2025學年物理八年級第一學期期末質(zhì)量檢測模擬試題含解析
- 南昌艾溪湖中學2025屆化學九年級第一學期期末統(tǒng)考模擬試題含解析
- 南京市聯(lián)合體2024年化學九年級第一學期期末調(diào)研模擬試題含解析
- 城市智慧管網(wǎng)建設與運營管理
- 氫氣管道抗脆化行業(yè)新探索
- 2025至2030輪胎制造機械行業(yè)項目調(diào)研及市場前景預測評估報告
- 影視制作專業(yè)學生影視傳媒職業(yè)發(fā)展手冊
- 2025至2030全球及中國收入周期中期管理和臨床文檔改進行業(yè)運營態(tài)勢與投資前景調(diào)查研究報告
- 智慧城市建設中的新發(fā)展理念學習心得體會
- DLT 5035-2016 發(fā)電廠供暖通風與空氣調(diào)節(jié)設計規(guī)范
- DZ∕T 0201-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 鎢、錫、汞、銻(正式版)
- 小小科學家《物理》模擬試卷A(附答案)
- 《風電場項目經(jīng)濟評價規(guī)范》(NB-T 31085-2016)
- 弟子規(guī)注音A4直接打印版
- 金融學原理重點總結(jié)彭興韻
- 譯林版三年級英語上冊《全冊課件》ppt
- 反恐C-TPAT程序文件整套(通用)
- ma600學員座艙圖冊用戶培訓中心
- 液壓過濾器的設計和制造
- 《義務教育英語課程標準(2022年版)》自測題、綜合測試題、初中英語新課標過關抽測試卷及優(yōu)秀答卷(共17套附答案)
評論
0/150
提交評論