c語(yǔ)言指針教程_第1頁(yè)
c語(yǔ)言指針教程_第2頁(yè)
c語(yǔ)言指針教程_第3頁(yè)
c語(yǔ)言指針教程_第4頁(yè)
c語(yǔ)言指針教程_第5頁(yè)
已閱讀5頁(yè),還剩50頁(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、第9章 指 針,指針是語(yǔ)言中的重要概念,也是語(yǔ)言的重要特色。使用指針,可以使程序更加簡(jiǎn)潔、緊湊、高效。 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)存中存儲(chǔ)單元的編號(hào) (1)計(jì)算機(jī)硬件系統(tǒng)的內(nèi)存儲(chǔ)器中,擁有大量的存儲(chǔ)單元(容量為字節(jié))。 為了方便管理,必須為每一個(gè)存儲(chǔ)單元編號(hào),這個(gè)編號(hào)就是存儲(chǔ)單元的“地址”。每個(gè)存儲(chǔ)單元都有一個(gè)惟一的地址。 (

2、2)在地址所標(biāo)識(shí)的存儲(chǔ)單元中存放數(shù)據(jù)。 注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個(gè)完全不同的概念。 2.變量地址系統(tǒng)分配給變量的內(nèi)存單元的起始地址 假設(shè)有這樣一個(gè)程序:,main() int num; scanf(%d,”時(shí),存取變量num值的方式可以有兩種:,(1)直接訪問(wèn)直接利用變量的地址進(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; /*定義一個(gè)指向int型數(shù)據(jù)的指針變量p_int */ float num_f=3.14, *p_f;/*定義一個(gè)指向float型數(shù)據(jù)的指針變量p_f */ char num_ch=p, *p_ch;/*定義一個(gè)指向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 程序說(shuō)明: (1)頭三行的變量定義語(yǔ)句指針變量的定義 與一般變量的定義相比,除變量名前多了一個(gè)

4、星號(hào)“*” (指針變量的定義標(biāo)識(shí)符)外,其余一樣: 數(shù)據(jù)類型 *指針變量, *指針變量2; 注意:此時(shí)的指針變量p_int、p_f、p_ch,并未指向某個(gè)具體的變量(稱指針是懸空的)。使用懸空指針很容易破壞系統(tǒng),導(dǎo)致系統(tǒng)癱瘓。,(2)中間三行的賦值語(yǔ)句取地址運(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 程序說(shuō)明: (1)第5行的if語(yǔ)句 如果*num1_p*num2_p (即num1num

5、2),則交換指針,使num1_p指向變量num2(較小值),num2_p指向變量num1(較大值)。 (2)printf(“min=%d, max=%dn”, *num1_p, *num2_p); 語(yǔ)句:通過(guò)指針變量,間接訪問(wèn)變量的值。,本案例的處理思路是:交換指針變量num1_p 和num2_p的值,而不是變量num1和num2的值(變量num1和num2并未交換,仍保持原值),最后通過(guò)指針變量輸出處理結(jié)果。 9.2.2 指針變量作函數(shù)參數(shù) 1.指針變量,既可以作為函數(shù)的形參,也可以作函數(shù)的實(shí)參。 2.指針變量作實(shí)參時(shí),與普通變量一樣,也是“值傳遞”,即將指針變量的值(一個(gè)地址)傳遞給被調(diào)用

6、函數(shù)的形參(必須是一個(gè)指針變量)。 注意:被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指向的變量的值。,案例9.3 使用函數(shù)調(diào)用方式改寫案例9.2,要求實(shí)參為指針變量。 /*案例代碼文件名:AL9_3.C*/*/*exchange()功能:交換2個(gè)形參指針變量所指向的變量的值 */*形參:2個(gè),均為指向整型數(shù)據(jù)的指針變量 */*返回值:無(wú) */*/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()之前、之時(shí)、結(jié)束時(shí)和結(jié)束后的情況,如圖9-5所示。 形參指針變量pointer1(指向變量num1)和pointer2(指向變量num2),在函數(shù)調(diào)用開始時(shí)才分配存儲(chǔ)空間,函數(shù)調(diào)用結(jié)束后立即被釋放。 雖然被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但可以改變它們所指向的變

9、量的值。 總結(jié):為了利用被調(diào)用函數(shù)改變的變量值,應(yīng)該使用指針(或指針變量)作函數(shù)實(shí)參。其機(jī)制為:在執(zhí)行被調(diào)用函數(shù)時(shí),使形參指針變量所指向的變量的值發(fā)生變化;函數(shù)調(diào)用結(jié)束后,通過(guò)不變的實(shí)參指針(或?qū)崊⒅羔樧兞浚⒆兓闹当A粝聛?lái)。,案例9.4 輸入3個(gè)整數(shù),按降序(從大到小的順序)輸出。要求使用變量的指針作函數(shù)調(diào)用的實(shí)參來(lái)實(shí)現(xiàn)。 /*案例代碼文件名:AL9_4.C*/ /*/ /*exchange()功能:交換2個(gè)形參指針變量所指向的變量的值 */ /*形參:2個(gè),均為指向整型數(shù)據(jù)的指針變量 */ /*返回值:無(wú) */ /*/ void exchange(int *pointer1, int *

10、pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; ,/*主函數(shù)main()*/ main() int num1,num2,num3; /*從鍵盤上輸入3個(gè)整數(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個(gè)元素的地址相同),所以可以用數(shù)組名給指針變量賦值。,3.數(shù)組元素的引用 數(shù)組元素的引用,既可用下標(biāo)法,也可用指針法。使用下標(biāo)法,直觀;而使用指針法,能使目標(biāo)程序占用內(nèi)存少、運(yùn)行速度快。 9.3.2 通過(guò)指針引用數(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)法來(lái)使用。例如,pointeri等價(jià)于*(pointer+i)。 注意:pointer+1指向數(shù)組的下一個(gè)元素,而不是簡(jiǎn)單地使指針變量pointer的值+1。其實(shí)際變化為pointer+1*size(size為一個(gè)元素占用的字節(jié)數(shù))。 例如,假設(shè)指針變量pointer的當(dāng)前值為3000,則

13、pointer+1為3000+1*2=3002,而不是3001。,案例9.5 使用指向數(shù)組的指針變量來(lái)引用數(shù)組元素。 /*案例代碼文件名:AL9_5.C*/ /*程序功能:使用指向數(shù)組的指針變量來(lái)引用數(shù)組元素*/ main() int array10, *pointer=array, i; printf(“Input 10 numbers: ”); for(i=0; i10; i+) scanf(“%d”, pointer+i);/*使用指針變量來(lá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,程序說(shuō)明: 程序中第3行和第6行的2個(gè)for語(yǔ)句,等價(jià)于下面的程序段: for(i=0; i10; i+,pointer+) scanf(“%d”,pointer); printf(“array10: ”); pointer=array; /*使pointer重新指向數(shù)組的第一個(gè)元素*/ for(i=0; i10; i+,pointer+) printf(“%d”,

15、*pointer); 思考題: (1)如果去掉“pointer=array;”行,程序運(yùn)行結(jié)果會(huì)如何?請(qǐng)上機(jī)驗(yàn)證。 (2)在本案例中,也可以不使用i來(lái)作循環(huán)控制變量,程序怎么修改?提示:指針可以參與關(guān)系運(yùn)算。,說(shuō)明: (1)指針變量的值是可以改變的,所以必須注意其當(dāng)前值,否則容易出錯(cuò)。 (2)指向數(shù)組的指針變量,可以指向數(shù)組以后的內(nèi)存單元,雖然沒有實(shí)際意義。 (3)對(duì)指向數(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個(gè)數(shù)據(jù)單位,而不是

16、n個(gè)字節(jié)。顯然,px+/+px和px-/-px是pxn的特例(n=1)。 px-py:兩指針之間的數(shù)據(jù)個(gè)數(shù),而不是指針的地址之差。,2)關(guān)系運(yùn)算 表示兩個(gè)指針?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ù)組的指針變量作函數(shù)參數(shù)時(shí),可有種等價(jià)形式(本質(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ù)組定義語(yǔ)句: int array34; (1)從2維數(shù)組角度看,數(shù)組名array代表數(shù)組的起始地址, 是一個(gè)以行為單位進(jìn)行控制的行指針: array+i:行指針值,指向2維數(shù)組的第i行。 *(array+i):(列)指針值,指向第i行第列(控制由行轉(zhuǎn)為列,但仍為指針)。 *(*(array+i):數(shù)組元素arrayi0的值。 用array作指針訪問(wèn)數(shù)組元素arrayij的格式: *(*(array+i)j) 注意:行指針是一個(gè)級(jí)指針,如圖9-7所示。 (2)從1維數(shù)組角度看

18、,數(shù)組名array和第1維下標(biāo)的每一個(gè)值, 共同構(gòu)成一組新的1維數(shù)組名array0、array1、array2,它們均由4個(gè)元素組成。,語(yǔ)言規(guī)定:數(shù)組名代表數(shù)組的地址,所以arrayi是第i行1維數(shù)組的地址, 它指向該行的第0列元素,是一個(gè)以數(shù)組元素為單位進(jìn)行控制的列指針: arrayi+j:(列)指針值,指向數(shù)組元素arrayij。 *(arrayi+j):數(shù)組元素arrayij的值。 如果有“int array34,*p=array0;”,則p+1指向下一個(gè)元素,如圖9-8所示。 用p作指針訪問(wèn)數(shù)組元素arrayij的格式: *(p+(*每行列數(shù)+j) ) 2.行指針變量指向由n個(gè)元素組成

19、的一維數(shù)組的指針變量 (1)定義格式 數(shù)據(jù)類型 (*指針變量)n;,注意:“*指針變量”外的括號(hào)不能缺,否則成了指針數(shù)組數(shù)組的每個(gè)元素都是一個(gè)指針指針數(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; /*定義一個(gè)(列)指針變量pointer*/ pointer=array0; /*給(列)指針變量pointer賦值*/ printf(“Input row = ”); scanf(“%d”, 程序演示,3. 2維數(shù)組指針作函數(shù)參數(shù) 2維數(shù)組的指針作函數(shù)實(shí)參時(shí),有列指針和行指針兩種形式。相應(yīng)的,用來(lái)接受實(shí)參數(shù)組指針的形參,必須使用相應(yīng)形式的指針變量,如下所示: 實(shí)參: 列指針 行指針 形參: (列)指針變量 行指針變量 9.3.5 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn) 在程序運(yùn)行過(guò)程中,數(shù)組的大小是不能改變的。這種數(shù)組稱為靜態(tài)數(shù)組。靜態(tài)數(shù)組的缺點(diǎn)是:對(duì)于事先無(wú)法準(zhǔn)確估計(jì)數(shù)據(jù)量的情況,無(wú)法做到既滿足處理需要

22、,又不浪費(fèi)內(nèi)存空間。 所謂動(dòng)態(tài)數(shù)組是指,在程序運(yùn)行過(guò)程中,根據(jù)實(shí)際需要指定數(shù)組的大小。 在C語(yǔ)言中,可利用內(nèi)存的申請(qǐng)和釋放庫(kù)函數(shù),以及指向數(shù)組的指針變量可當(dāng)數(shù)組名使用的特點(diǎn),來(lái)實(shí)現(xiàn)動(dòng)態(tài)數(shù)組。,動(dòng)態(tài)數(shù)組的本質(zhì)是:一個(gè)指向數(shù)組的指針變量。 案例9.7 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)。 /*案例代碼文件名:AL9_7.C*/ /*程序功能:實(shí)現(xiàn)動(dòng)態(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個(gè)數(shù)據(jù)*/ printf(“Input %d elements: ”, num); for (i=0; inum; i+) scanf(“%d”, /*釋放由malloc()函數(shù)申請(qǐng)的內(nèi)存塊*/ 程序演示 程序運(yùn)行情況: Input the number of element: 3 Input 3 elements: 1 2 3 3 elements are: 1,2,3,程序說(shuō)明: (1) array=(int *)malloc( sizeof(int) * num );語(yǔ)句malloc()函數(shù)和sizeof運(yùn)算符 1)庫(kù)函數(shù)mallo

24、c() 用法:void *malloc(unsigned size) 功能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)分配個(gè)長(zhǎng)度為size的連續(xù)空間。 返回值:申請(qǐng)成功,則返回新分配內(nèi)存塊的起始地址;否則,返回NULL。 函數(shù)原型:alloc.h,stdlib.h。 malloc()函數(shù)的返回值是一個(gè)無(wú)類型指針,其特點(diǎn)是可以指向任何類型的數(shù)據(jù)。但在實(shí)際使用malloc()函數(shù)時(shí),必須將其返回值強(qiáng)制轉(zhuǎn)換成被賦值指針變量的數(shù)據(jù)類型,以免出錯(cuò)。 2)運(yùn)算符sizeof 格式:sizeof(變量名類型名) 功能:求變量類型占用的內(nèi)存字節(jié)數(shù)(正整數(shù))。例如,在IBM-PC機(jī)上,sizeof(int)=2。,思考題:在該語(yǔ)句中,

25、使用sizeof(int)求出1個(gè)int型數(shù)據(jù)占用的內(nèi)存字節(jié)數(shù),而不是使用常量“2”,為什么? (2) scanf(“%d”, 語(yǔ)句 “b” 在該語(yǔ)句中的作用是,使光標(biāo)定位到最后一個(gè)數(shù)據(jù)后的分隔符“,”上,然后再輸出一個(gè)空格,以達(dá)到刪除之目的。,(4) free(array);語(yǔ)句庫(kù)函數(shù)free() 用法:void free(void *ptr) 功能:釋放由ptr指向的內(nèi)存塊(ptr是調(diào)用malloc() 函數(shù)的返回值)。 返回值:無(wú)。 函數(shù)原型:stdlib.h,alloc.h。 原則上,使用malloc()函數(shù)申請(qǐng)的內(nèi)存塊,操作結(jié)束后,應(yīng)及時(shí)使用free()函數(shù)予以釋放。尤其是循環(huán)使用m

26、alloc()函數(shù)時(shí),如果不及時(shí)釋放不再使用的內(nèi)存塊,很可能很快就耗盡系統(tǒng)的內(nèi)存資源,從而導(dǎo)致程序無(wú)法繼續(xù)運(yùn)行。 Return,9.4 字符串的指針和指向字符串的指針變量,字符串在內(nèi)存中的起始地址稱為字符串的指針,可以定義一個(gè)字符指針變量指向一個(gè)字符串。 9.4.1 字符串的表示與引用 在語(yǔ)言中,既可以用字符數(shù)組表示字符串,也可用字符指針變量來(lái)表示;引用時(shí),既可以逐個(gè)字符引用,也可以整體引用。 1.逐個(gè)引用 案例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. 程序說(shuō)明:char *string=I love Beijing.;語(yǔ)句 定義并初始化字符指針變量string:用串常量“I love Beijing.”的地址(由系統(tǒng)自動(dòng)開辟、存儲(chǔ)串常量的內(nèi)存塊的首地址)給string賦初值。 該語(yǔ)句也可分成如下所示的兩條語(yǔ)句: char *string; string=I love Beijing.; 注意:字符指針變量string中,僅存儲(chǔ)串常量的地址,而串常量的內(nèi)容(即字符串本身),是存儲(chǔ)在由

28、系統(tǒng)自動(dòng)開辟的內(nèi)存塊中,并在串尾添加一個(gè)結(jié)束標(biāo)志0。,2.整體引用 案例9.9 采取整體引用的辦法,改寫案例9.8。 /*案例代碼文件名:AL9_9.C*/ /*程序功能:使用字符指針變量表示和引用字符串*/ main() char *string=”I love Beijing.”; printf(“%sn”,string); 程序演示 程序說(shuō)明:printf(%sn,string);語(yǔ)句 通過(guò)指向字符串的指針變量string,整體引用它所指向的字符串的原理:系統(tǒng)首先輸出string指向的第一個(gè)字符,然后使string自動(dòng)加,使之指向下一個(gè)字符;重復(fù)上述過(guò)程,直至遇到字符串結(jié)束標(biāo)志。,注意:

29、其它類型的數(shù)組,是不能用數(shù)組名來(lái)一次性輸出它的全部元素的,只能逐個(gè)元素輸出。 例如: int array10=; . printf(%dn,array); /*這種用法是非法的*/ . 3.字符指針變量與字符數(shù)組之比較 雖然用字符指針變量和字符數(shù)組都能實(shí)現(xiàn)字符串的存儲(chǔ)和處理,但二者是有區(qū)別的,不能混為一談。 (1)存儲(chǔ)內(nèi)容不同。 字符指針變量中存儲(chǔ)的是字符串的首地址,而字符數(shù)組中存儲(chǔ)的是字符串本身(數(shù)組的每個(gè)元素存放一個(gè)字符)。,(2)賦值方式不同。 對(duì)字符指針變量,可采用下面的賦值語(yǔ)句賦值: char *pointer; pointer=This is a example.; 而字符數(shù)組,雖

30、然可以在定義時(shí)初始化,但不能用賦值語(yǔ)句整體賦值。下面的用法是非法的: char char_array20; char_array=This is a example.; /*非法用法*/ (3)指針變量的值是可以改變的,字符指針變量也不例外;而數(shù)組名代表數(shù)組的起始地址,是一個(gè)常量,而常量是不能被改變的。 9.4.2 字符串指針作函數(shù)參數(shù),案例9.10 用函數(shù)調(diào)用方式,實(shí)現(xiàn)字符串的復(fù)制。 /*案例代碼文件名:AL9_10.C*/ /*/ /*string_copy()函數(shù):復(fù)制一個(gè)字符串 */ /*形參:字符指針str_from接收源串,字符指針 str_to存儲(chǔ)目標(biāo)串 */ /*返回值:無(wú) *

31、/ /*/ void string_copy(char *str_from, char *str_to) int i=0; for(; (*(str_to+i)=*(str_from+i)!=0; i+) ; /*循環(huán)體為空語(yǔ)句*/ 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. 程序說(shuō)明:

32、for(; (*(str_to+i)=*(str_from+i)!=0; i+) ; 語(yǔ)句的執(zhí)行過(guò)程為:首先將源串中的當(dāng)前字符,復(fù)制到目標(biāo)串中;然后判斷該字符(即賦值表達(dá)式的值)是否是結(jié)束標(biāo)志。如果不是,則相對(duì)位置變量i的值增1,以便復(fù)制下一個(gè)字符;如果是結(jié)束標(biāo)志,則結(jié)束循環(huán)。其特點(diǎn)是:先復(fù)制、后判斷,循環(huán)結(jié)束前,結(jié)束標(biāo)志已經(jīng)復(fù)制。 在C語(yǔ)言中,用賦值運(yùn)算符、而不是賦值語(yǔ)句來(lái)實(shí)現(xiàn)賦值操作,能給某些處理帶來(lái)很大的靈活性,該語(yǔ)句(實(shí)現(xiàn)字符串的復(fù)制)的用法就是最好的例證。 Return,9.5 返回指針值的函數(shù),一個(gè)函數(shù)可以返回一個(gè)int型、float型、char型的數(shù)據(jù),也可以返回一個(gè)指針類型的數(shù)

33、據(jù)。 返回指針值的函數(shù)(簡(jiǎn)稱指針函數(shù))的定義格式如下: 函數(shù)類型 *函數(shù)名(形參表) 案例9.11 某數(shù)理化三項(xiàng)競(jìng)賽訓(xùn)練組有3個(gè)人,找出其中至少有一項(xiàng)成績(jī)不合格者。要求使用指針函數(shù)實(shí)現(xiàn)。/*案例代碼文件名:AL9_11.C*/*/*seek()函數(shù):判斷是否有不合格成績(jī) */*形參:指向由3個(gè)int型元素組成的1維數(shù)組的行指針變量 */*返回值:(1)有不合格成績(jī),則返回指向本行首列的一個(gè)(列)指針; */* (2)沒有有不合格成績(jī),返回值為指向下一行的一個(gè)(列)指針 */*/,int *seek( int (*pnt_row)3 ) int i=0, *pnt_col; /*定義一個(gè)(列)指

34、針變量pnt_col */ pnt_col=*(pnt_row+1); /*使pnt_col指向下一行之首(作標(biāo)志用)*/ for(; i3; i+) if(*(*pnt_row+i)60) /*某項(xiàng)成績(jī)不合格*/ 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; /*定義一個(gè)(列)指針變量pointer */ for(i=0; i3; i+) /

35、*控制每個(gè)學(xué)生*/ pointer=seek(grade+i); /*用行指針作實(shí)參,調(diào)用seek()函數(shù)*/ if(pointer=*(grade+i) /*該學(xué)生至少有一項(xiàng)成績(jī)不合格*/ /*輸出該學(xué)生的序號(hào)和各項(xiàng)成績(jī)*/ 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,程序說(shuō)明: (1) 主函數(shù)中的pointer=seek(grade+i);語(yǔ)句 調(diào)用seek()函數(shù)時(shí),將實(shí)參

36、grade+i(行指針)的值,復(fù)制到形參pnt_row(行指針變量)中,使形參pnt_row指向grade數(shù)組的第i行。 (2)在指針函數(shù)seek()中: 1) pnt_col=*(pnt_row+1);語(yǔ)句 *(pnt_row+1)將行指針轉(zhuǎn)換為列指針,指向grade數(shù)組的第i+1行第列,并賦值給(列)指針變量pnt_col。 2) if(*(*pnt_row+i)60)行 pnt_row是一個(gè)行指針,指向數(shù)組grade的第i行;*pnt_row使指針由行轉(zhuǎn)換為列,指向數(shù)組grade的第i行列;*pnt_row+j的值還是一個(gè)指針,指向數(shù)組的第i行第j列;*(*pnt_rowj)是一個(gè)數(shù)據(jù)(

37、數(shù)組元素gradeij的值)。 Return,9.6 指針數(shù)組與主函數(shù)main()的形參,9.6.1 指針數(shù)組 1.概念 數(shù)組的每個(gè)元素都是一個(gè)指針數(shù)據(jù)。指針數(shù)組比較適合用于指向多個(gè)字符串,使字符串處理更加方便、靈活。 2.定義格式 數(shù)據(jù)類型 *數(shù)組名元素個(gè)數(shù) 注意:與行指針變量定義格式“(*行指針變量)”的差別。 案例9.12 有若干計(jì)算機(jī)圖書,請(qǐng)按字母順序,從小到大輸出書名。解題要求:使用排序函數(shù)完成排序,在主函數(shù)中進(jìn)行輸入輸出。/*案例代碼文件名:AL9_12.C*/*程序功能:指針數(shù)組應(yīng)用示例*/,/*/ /* sort()函數(shù):對(duì)字符指針數(shù)組進(jìn)行排序 */ /*形參:name字符指針

38、數(shù)組,count元素個(gè)數(shù)*/ /*返回值:無(wú) */ /*/ 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,程序說(shuō)明: (1)實(shí)參對(duì)形參的值傳遞: sort( name , 5 ); void sort(char *name, int count) (2)字符串的比較只能使用strcmp()函數(shù)。形參字符指針數(shù)組name的每個(gè)元素,都是一個(gè)指向字符串的指針,所以有strcmp(namemin,namej)。 9.6.2 主函數(shù)main()的形參

40、 在以往的程序中,主函數(shù)main()都使用其無(wú)參形式。實(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ù)個(gè)數(shù)不對(duì)!n); else c=*argv1;/*截取第二個(gè)實(shí)參字符串的第一個(gè)字符*/ switch(c) case +: /*執(zhí)行加密*/ /*加密程序

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論