C語言程序設(shè)計課件第8章 8.3指針與函數(shù)_第1頁
C語言程序設(shè)計課件第8章 8.3指針與函數(shù)_第2頁
C語言程序設(shè)計課件第8章 8.3指針與函數(shù)_第3頁
C語言程序設(shè)計課件第8章 8.3指針與函數(shù)_第4頁
C語言程序設(shè)計課件第8章 8.3指針與函數(shù)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C語言程序設(shè)計函數(shù)的參數(shù)不僅可以是一般數(shù)據(jù)類型的數(shù)據(jù)(如整型、浮點型、字符型等數(shù)據(jù)),還可以是指針類型。它的作用是將一個變量的地址傳送到另一個函數(shù)中。【例8-11】編寫swap函數(shù)實現(xiàn)兩個變量值的交換?!締栴}分析】在第8章的例8-6中編寫過swap函數(shù),但是沒能實現(xiàn)互換主函數(shù)中兩個變量的值。原因是:C語言規(guī)定,實參對形參變量的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只由實參傳給形參,而不能由形參傳回給實參。因此,如果希望將交換后的值帶回到主函數(shù)中,可以利用指針作為函數(shù)參數(shù),它將一個變量的地址傳遞到被調(diào)函數(shù)中。由于指針指向的單元和變量對應(yīng)的單元相同,因此,可以在被調(diào)函數(shù)中通過指針運算符“*”實現(xiàn)對主調(diào)函數(shù)中變量值的修改。

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)【參考代碼】#include<stdio.h>voidswap(int*p1,int*p2) /*swap函數(shù)用于交換兩數(shù)的值*/{ intt; /*定義整型變量t*/ t=*p1; /*實現(xiàn)兩數(shù)交換*/ *p1=*p2; *p2=t;}intmain(){ inti=2,j=3; /*定義整型變量i和j并初始化*/ printf("BeforeSwap:i=%d,j=%d\n",i,j);/*輸出調(diào)用swap函數(shù)前i和j的值*/ swap(&i,&j); /*調(diào)用swap函數(shù),參數(shù)為i和j的地址*/ printf("AfterSwap:i=%d,j=%d\n",i,j); /*輸出調(diào)用swap函數(shù)后i和j的值*/ return0;}

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)【運行結(jié)果】程序運行結(jié)果如圖所示。

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)【程序說明】該程序中,swap函數(shù)的形參為指向整型的指針,調(diào)用swap函數(shù)的實參為整型變量的地址。調(diào)用swap函數(shù)后,指針變量p1中存入變量i的地址,指針變量p2中存入變量j的地址,即指針變量p1指向變量i,指針變量p2指向變量j。調(diào)用swap函數(shù),首先執(zhí)行語句“t=*p1;”,將指針p1所指的內(nèi)容存入臨時變量t中;然后執(zhí)行語句“*p1=*p2;”,將指針p2所指的內(nèi)容存入指針p1所指的變量中;最后執(zhí)行語句“*p2=t;”,將臨時變量t暫存的數(shù)據(jù)送入指針p2所指的變量中;從而完成交換兩個變量值的操作。swap函數(shù)的執(zhí)行過程和各個變量值的變化可用圖描述。

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)【例8-12】將例8-11的程序改寫成以下程序,試分析輸出結(jié)果。#include<stdio.h>voidswap(int*p1,int*p2){ int*t; t=p1; p1=p2; p2=t;}intmain(){ inti=2,j=3; printf("BeforeSwap:i=%d,j=%d\n",i,j); swap(&i,&j); printf("AfterSwap:i=%d,j=%d\n",i,j); return0;}

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)【運行結(jié)果】程序運行結(jié)果如圖所示。

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)【程序說明】同樣是使用指針作為形參,但是卻沒有實現(xiàn)交換變量i和j的值。原因是:在本例中語句“p1=p2;”的含義與例8-11中語句“*p1=*p2;”是不同的,它的含義是“將指針變量p2的值賦給指針變量p1”,即實現(xiàn)指針變量之間的相互賦值。swap函數(shù)的執(zhí)行過程和各個變量值的變化可用圖描述。

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)

高手點撥雖然C語言的函數(shù)參數(shù)都是值傳遞,但是可以通過地址間接地把被調(diào)函數(shù)的某些數(shù)值傳送給主調(diào)函數(shù)。指針參數(shù)傳遞中應(yīng)注意:形參和實參共用同一存儲單元,要從被調(diào)函數(shù)中獲得多個值,可用多個指針變量作為函數(shù)參數(shù),通過修改指針所指變量的值來返回多個值。前面介紹了如何定義和使用指向數(shù)組的指針變量,這里介紹了指向數(shù)組的指針變量作函數(shù)參數(shù)的方法。

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)【例8-13】編寫程序,實現(xiàn)輸入一個字符串,調(diào)用自定義函數(shù)length()計算字符串的長度并輸出?!締栴}分析】定義函數(shù)length(),用來計算字符串的長度,在主函數(shù)中調(diào)用此函數(shù),函數(shù)的形參和實參可以用字符指針變量。

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)【參考代碼】#include<stdio.h>intlength(char*s) /*s為指向字符串的指針*/{ intlen=0; /*定義變量len用于存儲字符串的長度*/ while(*s!='\0') /*當“*s!='\0'”成立時循環(huán),計算字符串長度*/ { len++; s++; }

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù) returnlen; /*返回len的值*/}intmain(){ chara[30],*string=a; /*定義字符數(shù)組a,定義指針變量string指向a*/ printf("Pleaseinputastring:"); gets(string); /*輸入字符串*/ printf("String=%s,length=%d\n",string,length(string)); /*輸出字符串及字符串長度*/ return0;}

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)【運行結(jié)果】程序運行結(jié)果如圖所示?!境绦蛘f明】main函數(shù)中的string是字符指針變量,指向字符數(shù)組a的首地址。length函數(shù)的形參s是字符指針變量,在調(diào)用length函數(shù)時,將數(shù)組a的首地址傳給s,即s指向字符串的第一個字符a[0]。在while循環(huán)中,先檢查s當前所指向的字符是否為'\0',如果不是就讓長度加1,s指向下一個元素,如此循環(huán),直到s指向字符'\0'為止,返回的len值即為字符串長度。

8.4指針與函數(shù)8.4.1

指針變量作為函數(shù)參數(shù)一個函數(shù)可以返回一個基本類型的值,也可以返回一個指針類型的數(shù)據(jù),即地址。當將地址作為函數(shù)返回值時,該函數(shù)被稱為指針函數(shù)。其定義形式為:數(shù)據(jù)類型*函數(shù)名(形參表){ 函數(shù)體;}其中,函數(shù)名前面的“*”表示該函數(shù)為指針型函數(shù),即返回值類型為指針,數(shù)據(jù)類型表明指針指向的類型。因此,函數(shù)的返回值是一個指向該數(shù)據(jù)類型的指針。【例8-14】使用指針函數(shù)求兩個變量的最大值。【例8-15】使用指針函數(shù)實現(xiàn)求兩個變量的最大值,返回指向較大值的指針變量,輸出指針變量指向的變量的值?!締栴}分析】

8.4指針與函數(shù)8.4.2

指針作為函數(shù)的返回值【參考代碼】#include<stdio.h>int*max(int*x,int*y) /*函數(shù)max的返回值為指向整型的指針*/{ int*p; p=*x>*y?x:y; /*p為指向最大值的指針*/ return(p); /*返回指針p*/}intmain(){ inta,b,*pmax; /*指針pmax指向最大值變量*/ printf("pleaseinputaandb:"); scanf("%d,%d",&a,&b); pmax=max(&a,&b); /*調(diào)用max時實參為變量a和b的地址*/ printf("max=%d\n",*pmax); /*輸出較大值*/ return0;}

8.4指針與函數(shù)8.4.2

指針作為函數(shù)的返回值【運行結(jié)果】程序運行結(jié)果如圖所示。

8.4指針與函數(shù)8.4.2

指針作為函數(shù)的返回值如果程序中定義了一個函數(shù),在編譯時,編譯系統(tǒng)會為該函數(shù)分配一段存儲空間,這段存儲空間的起始地址又稱為入口地址。當調(diào)用該函數(shù)時,系統(tǒng)會從這個入口地址開始執(zhí)行該函數(shù)。存放函數(shù)入口地址的指針就是一個指向函數(shù)的指針,簡稱函數(shù)的指針。其定義方式為:類型標識符(*指針變量名)(函數(shù)參數(shù)表列);如“int(*p)(int);”,這里的類型標識符為函數(shù)返回值的類型。

提示在C語言中,括號的優(yōu)先級比*高,因此,“*指針變量名”外部必須用括號,否則指針變量名首先與后面的括號結(jié)合,就是前面介紹的“指針函數(shù)”。例如:int(*pf)();/*定義一個指向函數(shù)的指針,該函數(shù)的返回值為整型數(shù)據(jù)*/int*f()/*定義一個返回值為指針的函數(shù),該指針指向一個整型數(shù)據(jù)*/

8.4指針與函數(shù)8.4.3

函數(shù)的指針和變量的指針一樣,函數(shù)的指針也必須賦初值,才能指向具體的函數(shù)。由于函數(shù)名代表了該函數(shù)的入口地址,因此,可以直接用函數(shù)名為函數(shù)指針賦值,即:函數(shù)指針名=函數(shù)名;例如:doublefun(inta); /*函數(shù)說明*/double(*p)(int); /*函數(shù)指針說明*/p=fun; /*f指向fun函數(shù)*/函數(shù)型指針經(jīng)定義和初始化之后,在程序中可以引用該指針,目的是調(diào)用被指針所指的函數(shù)。用函數(shù)指針變量調(diào)用函數(shù)時,只須將“(*p)”代替函數(shù)名即可(p為指針變量名),在“(*p)”之后的括號中可根據(jù)需要寫上實參。例如:b=(*p)(a); /*調(diào)用由p指向的函數(shù),實參為a,得到的函數(shù)值賦給b*/

8.4指針與函數(shù)8.4.3

函數(shù)的指針

名師點睛定義指向函數(shù)的指針變量,并不意味著這個指針變量可以指向任何函數(shù),它只能指向在定義時指定的類型的函數(shù)。如“int(*p)(int);”表示指針變量p只能指向函數(shù)返回值為整型且有一個整型參數(shù)的函數(shù)。在一個程序中,一個指針變量可以先后指向同類型的不同函數(shù)。另外,對指向函數(shù)的指針變量不能進行算術(shù)運算,如p+n、p++、p--等運算是無意義的?!纠?-15】【例8-15】用函數(shù)的指針實現(xiàn)從兩個數(shù)中輸出較大者。【問題分析】定義一個函數(shù)max,用于求較大數(shù),在主函數(shù)中定義指向函數(shù)的指針變量,使其指向max函數(shù),最后用函數(shù)指針變量調(diào)用函數(shù)。

8.4指針與函數(shù)8.4.3

函數(shù)的指針【參考代碼】#include<stdio.h>intmain(){ intmax(int,int); /*函數(shù)聲明*/ int(*pf)(int,int); /*函數(shù)指針定義*/ inta,b,c; pf=max; /*將函數(shù)的入口地址賦給指針*/ printf("pleaseinputaandb:");

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論