36、數(shù)控電火花自動控制1c語言_第1頁
36、數(shù)控電火花自動控制1c語言_第2頁
36、數(shù)控電火花自動控制1c語言_第3頁
36、數(shù)控電火花自動控制1c語言_第4頁
36、數(shù)控電火花自動控制1c語言_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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ù)的指針變量Return9.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)存單元的起始地址假設(shè)有這樣一個程序: main() int num; scanf(%d,&num); printf(num=%dn, num); 為描述方便,假設(shè)系統(tǒng)分配給變量num的2字節(jié)存儲單元為 3000 和3001,則起始地址3000就是變量num在內(nèi)存中的地址。 3.變量值的存取通過變量在內(nèi)存中的地址進行系統(tǒng)執(zhí)行“scanf(”%d“,&num);”和“printf(”num=%dn“, num);”時,存取變量num值的方式可以有兩種: (1)直接訪問直接利

3、用變量的地址進行存取 1)上例中scanf(“%d”,&num)的執(zhí)行過程是這樣的: 用變量名num作為索引值,檢索符號表,找到變量num的起始地址3000;然后將鍵盤輸入的值(假設(shè)為)送到內(nèi)存單元3000和3001中。此時,變量num在內(nèi)存中的地址和值分別是3000和3。 2)printf(num=%dn,num)的執(zhí)行過程,與scanf()很相似: 首先找到變量num的起始地址3000,然后從3000和3001中取出其值,最后將它輸出。 (2)間接訪問通過另一變量訪問該變量的值 語言規(guī)定:在程序中可以定義一種特殊的變量(稱為指針變量),用來存放其它變量的地址。例如,假設(shè)定義了這樣一個指針變

4、量num_pointer,它被分配到4000、4001單元,其值可通過賦值語句“num_pointer=num;”得到。此時,指針變量num_pointer的值就是變量num在內(nèi)存中的起始地址3000,如圖9-1所示。通過指針變量num_pointer存取變量num值的過程如下:首先找到指針變量num_pointer的地址(4000),取出其值3000(正好是變量num 的起始地址); 然后從3000、3001中取出變量num的值(3)。 (3)兩種訪問方式的比較 兩種訪問方式之間的關(guān)系,可以用某人甲(系統(tǒng))要找某人乙(變量)來類比。一種情況是,甲知道乙在何處,直接去找就是(即直接訪問)。另一

5、種情況是,甲不知道乙在哪,但丙(指針變量)知道,此時甲可以這么做:先找丙,從丙處獲得乙的去向,然后再找乙(即間接訪問)。4.指針與指針變量(1)指針即地址 一個變量的地址稱為該變量的指針。通過變量的指針能夠找到該變量。(2)指針變量專門用于存儲其它變量地址的變量指針變量num_pointer的值就是變量num的地址。指針與指針變量的區(qū)別,就是變量值與變量的區(qū)別。(3)為表示指針變量和它指向的變量之間的關(guān)系,用指針運算符“*”表示。 例如,指針變量num_pointer與它所指向的變量num的關(guān)系,表示為:*num_pointer,即*num_pointer等價于變量num。因此,下面兩個語句的

6、作用相同:num=3; /*將3直接賦給變量num*/num_pointer=# /*使num_pointer指向num */*num_pointer=3; /*將3賦給指針變量num_pointer所指向的變量*/Return9.2 指針變量的定義與應(yīng)用 9.2.1 指針變量的定義與相關(guān)運算案例9.1 指針變量的定義與相關(guān)運算示例。 /*案例代碼文件名: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

7、*/ 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; /*取變量num_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

8、”, num_ch, *p_ch); 程序演示程序運行結(jié)果:num_int=12, *p_int=12num_f=3.14, *p_f=3.14num_ch=p, *p_ch=p 程序說明:(1)頭三行的變量定義語句指針變量的定義 與一般變量的定義相比,除變量名前多了一個星號“*” (指針變量的定義標識符)外,其余一樣:數(shù)據(jù)類型 *指針變量, *指針變量2; 注意:此時的指針變量p_int、p_f、p_ch,并未指向某個具體的變量(稱指針是懸空的)。使用懸空指針很容易破壞系統(tǒng),導(dǎo)致系統(tǒng)癱瘓。 (2)中間三行的賦值語句取地址運算()取地址運算的格式: 變量例如,&num_int、&num_f、&

9、num_ch的結(jié)果,分別為變量num_int、num_f、num_ch的地址。注意:指針變量只能存放指針(地址),且只能是相同類型變量的地址。例如,指針變量p_int、p_f、p_ch,只能分別接收int型、float型、char型變量的地址,否則出錯。(3)后三行的輸出語句指針運算(*)使用直接訪問和間接訪問兩種方式,分別輸出變量num_int、num_f、num_ch的值。注意:這三行出現(xiàn)在指針變量前的星號“*”是指針運算符,訪問指針變量所指向的變量的值,而非指針運算符。案例9.2 使用指針變量求解:輸入2個整數(shù),按升序(從小到大排序)輸出。/*案例代碼文件名:AL9_2.C*/*程序功能

10、:使用指針變量求解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, num2); if( *num1_p *num2_p ) /*如果num1num2,則交換指針*/ pointer= num1_p,

11、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程序說明:(1)第5行的if語句 如果*num1_p*num2_p (即num1num2),則交換指針,使num1_p指向變量num2(較小值),num2_p指向變量num1(較大值)。(2)printf(“min=%d, max=%dn”, *num1_p, *num2_

12、p); 語句:通過指針變量,間接訪問變量的值。 本案例的處理思路是:交換指針變量num1_p 和num2_p的值,而不是變量num1和num2的值(變量num1和num2并未交換,仍保持原值),最后通過指針變量輸出處理結(jié)果。9.2.2 指針變量作函數(shù)參數(shù)1.指針變量,既可以作為函數(shù)的形參,也可以作函數(shù)的實參。2.指針變量作實參時,與普通變量一樣,也是“值傳遞”,即將指針變量的值(一個地址)傳遞給被調(diào)用函數(shù)的形參(必須是一個指針變量)。注意:被調(diào)用函數(shù)不能改變實參指針變量的值,但可以改變實參指針變量所指向的變量的值。案例9.3 使用函數(shù)調(diào)用方式改寫案例9.2,要求實參為指針變量。/*案例代碼文件

13、名:AL9_3.C*/*/*exchange()功能:交換2個形參指針變量所指向的變量的值 */*形參:2個,均為指向整型數(shù)據(jù)的指針變量 */*返回值:無 */*/void exchange(int *pointer1, int *pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; /*主函數(shù)main()*/main() int num1,num2; /*定義并初始化指針變量num1_p和 num2_p */ int *num1_p=&num1, *num2_p=&num2; printf(“Inpu

14、t 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); /*指針變量作實參*/ /*輸出排序后的num1和num2的值*/ printf(“min=%d, max=%dn”, num1, num2); 程序演示程序運行情況:Input th

15、e first number:9Input the second number:6num1=9, num2=6min=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ù)不能改變實參指針變量的值,但可以改變它們所指向的變量的值??偨Y(jié):為了利用被調(diào)用函數(shù)改變的變量值,應(yīng)該使用指針(或指針變量)作函數(shù)實參。其機制為:在執(zhí)行被調(diào)用函數(shù)時,使形參指針變量所指向的變量的值發(fā)生變化;函數(shù)調(diào)用結(jié)束后,通過不變

16、的實參指針(或?qū)崊⒅羔樧兞浚⒆兓闹当A粝聛怼?案例9.4 輸入3個整數(shù),按降序(從大到小的順序)輸出。要求使用變量的指針作函數(shù)調(diào)用的實參來實現(xiàn)。/*案例代碼文件名:AL9_4.C*/*/*exchange()功能:交換2個形參指針變量所指向的變量的值 */*形參:2個,均為指向整型數(shù)據(jù)的指針變量 */*返回值:無 */*/void exchange(int *pointer1, int *pointer2) int temp; temp=*pointer1, *pointer1=*pointer2, *pointer2=temp; /*主函數(shù)main()*/main() int num1,

17、num2,num3; /*從鍵盤上輸入3個整數(shù)*/ printf(“Input the first number: ”); scanf(“%d”, &num1); printf(“Input the second number: ”); scanf(“%d”, &num2); printf(“Input the third number: ”); scanf(“%d”, &num3); printf(“num1=%d, num2=%d, num3=%dn”, num1, num2, num3); /*排序*/ if( num1 num2 ) /*num1num2*/ exchange( &nu

18、m1, &num2 ); if( num1 num3 ) exchange( &num1, &num3 ); if( num2 num3 ) exchange( &num2, &num3 ); /*輸出排序結(jié)果*/ printf(“排序結(jié)果: %d, %d, %dn”,num1,num2,num3); 程序演示程序運行情況:Input the first number:9Input the second number:6Input the third number:12num1=9, num2=6, num3=12排序結(jié)果: 12, 9, 6Return9.3 數(shù)組的指針和指向數(shù)組的指針變量9

19、.3.1 概述1.概念數(shù)組的指針數(shù)組在內(nèi)存中的起始地址,數(shù)組元素的指針數(shù)組元素在內(nèi)存中的起始地址。2.指向數(shù)組的指針變量的定義指向數(shù)組的指針變量的定義,與指向普通變量的指針變量的定義方法一樣。例如,int array10, *pointer=array(或&array0);或者: int array10, *pointer; pointerarray;注意:數(shù)組名代表數(shù)組在內(nèi)存中的起始地址(與第1個元素的地址相同),所以可以用數(shù)組名給指針變量賦值。3.數(shù)組元素的引用數(shù)組元素的引用,既可用下標法,也可用指針法。使用下標法,直觀;而使用指針法,能使目標程序占用內(nèi)存少、運行速度快。9.3.2 通過指

20、針引用數(shù)組元素如果有“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ù))。例如,假設(shè)指針變量pointer的當前值為3000,則

21、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+i);/

22、*使用指向數(shù)組的指針變量輸出數(shù)組*/ printf(“n”); 程序演示程序運行情況:Input 10 numbers: 0 1 2 3 4 5 6 7 8 9array10: 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”,*pointer);思考題

23、:(1)如果去掉“pointer=array;”行,程序運行結(jié)果會如何?請上機驗證。(2)在本案例中,也可以不使用i來作循環(huán)控制變量,程序怎么修改?提示:指針可以參與關(guān)系運算。 說明: (1)指針變量的值是可以改變的,所以必須注意其當前值,否則容易出錯。 (2)指向數(shù)組的指針變量,可以指向數(shù)組以后的內(nèi)存單元,雖然沒有實際意義。 (3)對指向數(shù)組的指針變量(px和py)進行算術(shù)運算和關(guān)系運算的含義 1)可以進行的算術(shù)運算,只有以下幾種: pxn, px+/+px, px-/-px, px-py pxn:將指針從當前位置向前(+n)或回退(-n)n個數(shù)據(jù)單位,而不是n個字節(jié)。顯然,px+/+px和

24、px-/-px是pxn的特例(n=1)。 px-py:兩指針之間的數(shù)據(jù)個數(shù),而不是指針的地址之差。 2)關(guān)系運算 表示兩個指針所指地址之間、位置的前后關(guān)系:前者為小,后者為大。例如,如果指針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)形參用指針變量、實參用數(shù)組名(4)形參用數(shù)組名、實參用指針變

25、量 9.3.4 2維數(shù)組的指針及其指針變量 1. 2維數(shù)組的指針 假設(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ù)組角度看,數(shù)組名array和第1維下標的每一個值, 共同

26、構(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個元素組成的一維數(shù)組的指針變量(1)定義格式 數(shù)據(jù)類型 (*指針變量

27、)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(“Input row = ”); scanf(“%d”, &row); p

28、rintf(“Input col = ”); scanf(“%d”, &col); printf(“array%1d%1d = %dn”, row, col, *(*(pointer+row)+col); 程序演示程序運行情況: 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, r

29、ow, col; /*定義一個(列)指針變量pointer*/ pointer=array0; /*給(列)指針變量pointer賦值*/ printf(“Input row = ”); scanf(“%d”,&row); printf(“Input col = ”); scanf(“%d”,&col); printf(“array%1d%1d = %dn”, row, col, *(pointer+(row*4+col); 程序演示 3. 2維數(shù)組指針作函數(shù)參數(shù) 2維數(shù)組的指針作函數(shù)實參時,有列指針和行指針兩種形式。相應(yīng)的,用來接受實參數(shù)組指針的形參,必須使用相應(yīng)形式的指針變量,如下所示:

30、實參: 列指針 行指針 形參: (列)指針變量 行指針變量 9.3.5 動態(tài)數(shù)組的實現(xiàn) 在程序運行過程中,數(shù)組的大小是不能改變的。這種數(shù)組稱為靜態(tài)數(shù)組。靜態(tài)數(shù)組的缺點是:對于事先無法準確估計數(shù)據(jù)量的情況,無法做到既滿足處理需要,又不浪費內(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”#incl

31、ude “stdlib.h”main() int *array=NULL, num, i; printf(“Input the number of element: ”); scanf(“%d”, &num); /*申請動態(tài)數(shù)組使用的內(nèi)存塊*/ array=(int *)malloc( sizeof(int) * num ); if ( array=NULL )/*內(nèi)存申請失?。禾崾?,退出*/ printf(“out of memory, press any key to quit”); exit(0);/*exit():終止程序運行,返回操作系統(tǒng)*/ /*提示輸入num個數(shù)據(jù)*/ print

32、f(“Input %d elements: ”, num); for (i=0; inum; i+) scanf(“%d”, &arrayi); /*輸出剛輸入的num個數(shù)據(jù)*/ printf(“%d elements are: ”, num); for (i=0; inum; i+) printf(“%d,”, arrayi); printf(“b ”);/*刪除最后一個數(shù)據(jù)后的分隔符“,”*/ free(array);/*釋放由malloc()函數(shù)申請的內(nèi)存塊*/ 程序演示程序運行情況: Input the number of element: 3 Input 3 elements: 1

33、2 3 3 elements are: 1,2,3 程序說明:(1) array=(int *)malloc( sizeof(int) * num );語句malloc()函數(shù)和sizeof運算符1)庫函數(shù)malloc()用法: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)換成被賦值指針變

34、量的數(shù)據(jù)類型,以免出錯。2)運算符sizeof格式:sizeof(變量名類型名)功能:求變量類型占用的內(nèi)存字節(jié)數(shù)(正整數(shù))。例如,在IBM-PC機上,sizeof(int)=2。思考題:在該語句中,使用sizeof(int)求出1個int型數(shù)據(jù)占用的內(nèi)存字節(jié)數(shù),而不是使用常量“2”,為什么?(2) scanf(“%d”, &arrayi);語句和printf(“%d,”, arrayi);語句將指向數(shù)組的指針變量當作數(shù)組名使用,所以就必須按引用數(shù)組元素的語法規(guī)則來使用。(3) printf(“b ”);語句 “b” 在該語句中的作用是,使光標定位到最后一個數(shù)據(jù)后的分隔符“,”上,然后再輸出一個

35、空格,以達到刪除之目的。(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)使用malloc()函數(shù)時,如果不及時釋放不再使用的內(nèi)存塊,很可能很快就耗盡系統(tǒng)的內(nèi)存資源,從而導(dǎo)致程序無法繼續(xù)運行。Return9.4 字符串的指針和指向字符串的指針變量字符串在內(nèi)存中的起始地址稱為字符串的指針,可以定義一個字符指針變量

36、指向一個字符串。9.4.1 字符串的表示與引用在語言中,既可以用字符數(shù)組表示字符串,也可用字符指針變量來表示;引用時,既可以逐個字符引用,也可以整體引用。1.逐個引用案例9.8 使用字符指針變量表示和引用字符串。/*案例代碼文件名:AL9_8.C*/main() char *string=”I love Beijing.”; for(; *string!=0; string+) printf(“%c”, *string); printf(“n”); 程序演示程序運行結(jié)果: I love Beijing.程序說明:char *string=I love Beijing.;語句定義并初始化字符指針

37、變量string:用串常量“I love Beijing.”的地址(由系統(tǒng)自動開辟、存儲串常量的內(nèi)存塊的首地址)給string賦初值。該語句也可分成如下所示的兩條語句: char *string; string=I love Beijing.;注意:字符指針變量string中,僅存儲串常量的地址,而串常量的內(nèi)容(即字符串本身),是存儲在由系統(tǒng)自動開辟的內(nèi)存塊中,并在串尾添加一個結(jié)束標志0。2.整體引用案例9.9 采取整體引用的辦法,改寫案例9.8。/*案例代碼文件名:AL9_9.C*/*程序功能:使用字符指針變量表示和引用字符串*/main() char *string=”I love Bei

38、jing.”; printf(“%sn”,string); 程序演示程序說明:printf(%sn,string);語句通過指向字符串的指針變量string,整體引用它所指向的字符串的原理:系統(tǒng)首先輸出string指向的第一個字符,然后使string自動加,使之指向下一個字符;重復(fù)上述過程,直至遇到字符串結(jié)束標志。注意:其它類型的數(shù)組,是不能用數(shù)組名來一次性輸出它的全部元素的,只能逐個元素輸出。例如: int array10=; . printf(%dn,array); /*這種用法是非法的*/ .3.字符指針變量與字符數(shù)組之比較雖然用字符指針變量和字符數(shù)組都能實現(xiàn)字符串的存儲和處理,但二者是

39、有區(qū)別的,不能混為一談。(1)存儲內(nèi)容不同。字符指針變量中存儲的是字符串的首地址,而字符數(shù)組中存儲的是字符串本身(數(shù)組的每個元素存放一個字符)。(2)賦值方式不同。對字符指針變量,可采用下面的賦值語句賦值: char *pointer; pointer=This is a example.;而字符數(shù)組,雖然可以在定義時初始化,但不能用賦值語句整體賦值。下面的用法是非法的: char char_array20; char_array=This is a example.; /*非法用法*/(3)指針變量的值是可以改變的,字符指針變量也不例外;而數(shù)組名代表數(shù)組的起始地址,是一個常量,而常量是不能被

40、改變的。9.4.2 字符串指針作函數(shù)參數(shù)案例9.10 用函數(shù)調(diào)用方式,實現(xiàn)字符串的復(fù)制。/*案例代碼文件名:AL9_10.C*/*/*string_copy()函數(shù):復(fù)制一個字符串 */*形參:字符指針str_from接收源串,字符指針 str_to存儲目標串 */*返回值:無 */*/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.”; c

41、har array_str220; string_copy(array_str1, array_str2); /*數(shù)組名作實參*/ printf(“array_str2=%sn”, array_str2); 程序演示程序運行結(jié)果: I am a teacher.程序說明:for(; (*(str_to+i)=*(str_from+i)!=0; i+) ; 語句的執(zhí)行過程為:首先將源串中的當前字符,復(fù)制到目標串中;然后判斷該字符(即賦值表達式的值)是否是結(jié)束標志。如果不是,則相對位置變量i的值增1,以便復(fù)制下一個字符;如果是結(jié)束標志,則結(jié)束循環(huán)。其特點是:先復(fù)制、后判斷,循環(huán)結(jié)束前,結(jié)束標志已經(jīng)

42、復(fù)制。在C語言中,用賦值運算符、而不是賦值語句來實現(xiàn)賦值操作,能給某些處理帶來很大的靈活性,該語句(實現(xiàn)字符串的復(fù)制)的用法就是最好的例證。Return9.5 返回指針值的函數(shù) 一個函數(shù)可以返回一個int型、float型、char型的數(shù)據(jù),也可以返回一個指針類型的數(shù)據(jù)。 返回指針值的函數(shù)(簡稱指針函數(shù))的定義格式如下: 函數(shù)類型 *函數(shù)名(形參表) 案例9.11 某數(shù)理化三項競賽訓(xùn)練組有3個人,找出其中至少有一項成績不合格者。要求使用指針函數(shù)實現(xiàn)。/*案例代碼文件名:AL9_11.C*/*/*seek()函數(shù):判斷是否有不合格成績 */*形參:指向由3個int型元素組成的1維數(shù)組的行指針變量

43、*/*返回值:(1)有不合格成績,則返回指向本行首列的一個(列)指針; */* (2)沒有有不合格成績,返回值為指向下一行的一個(列)指針 */*/int *seek( int (*pnt_row)3 ) int i=0, *pnt_col; /*定義一個(列)指針變量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(

44、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+) /*控制每個學(xué)生*/ pointer=seek(grade+i); /*用行指針作實參,調(diào)用seek()函數(shù)*/ if(pointer=*(grade+i) /*該學(xué)生至少有一項成績不合格*/ /*輸出該學(xué)生的序號和各項成績*/ printf(“No.%d grade list: ”, i+1); for(j=0; j3; j+) prin

45、tf(“%d ”,*(pointer+j); printf(“n”); 程序演示程序運行結(jié)果:No.1 grade list: 55 65 75 程序說明:(1) 主函數(shù)中的pointer=seek(grade+i);語句調(diào)用seek()函數(shù)時,將實參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(*(*pn

46、t_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ù)(數(shù)組元素gradeij的值)。Return9.6 指針數(shù)組與主函數(shù)main()的形參9.6.1 指針數(shù)組 1.概念 數(shù)組的每個元素都是一個指針數(shù)據(jù)。指針數(shù)組比較適合用于指向多個字符串,使字符串處理更加方便、靈活。 2.定義格式 數(shù)據(jù)類型 *數(shù)組名元素個數(shù) 注意:與行指針變量定義格式“(*行指針變量)”的差別。 案例9.12 有若干計算機圖書,請按字母順序

47、,從小到大輸出書名。解題要求:使用排序函數(shù)完成排序,在主函數(shù)中進行輸入輸出。/*案例代碼文件名:AL9_12.C*/*程序功能:指針數(shù)組應(yīng)用示例*/*/* sort()函數(shù):對字符指針數(shù)組進行排序 */*形參:name字符指針數(shù)組,count元素個數(shù)*/*返回值:無 */*/void sort(char *name, int count) char *temp_p; int i,j,min; /*使用選擇法排序*/ for(i=0; icount-1; i+) /*外循環(huán):控制選擇次數(shù)*/ min=i; /*預(yù)置本次最小串的位置*/ for(j=i+1; j0) /*存在更小的串*/ min=

48、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(name,5); /*使用字符指針數(shù)組名作實參,調(diào)用排序函數(shù)sort()*/ /*輸出排序結(jié)果*/ for(; i5; i+) printf(“%sn”,namei); 程序演示程序運行結(jié)果:BASICCFORTRANFoxBASEPASCAL程序說明:(1)實參對形參的值傳遞: sort( name , 5 ); void sort(char *name, int count)(2)字符串的比較只能使用strcmp()函數(shù)。形參字符指針數(shù)組name的每個元素,都是一個指向字符串的指針,所以有strcmp(namemin,namej)。9.6.2 主函數(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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論