第10章 C語言 指針與函數(shù)_第1頁
第10章 C語言 指針與函數(shù)_第2頁
第10章 C語言 指針與函數(shù)_第3頁
第10章 C語言 指針與函數(shù)_第4頁
第10章 C語言 指針與函數(shù)_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第10章 指針與函數(shù)本章重點ll指針作為函數(shù)的參數(shù)。 指針函數(shù)的定義。10.1 指針與函數(shù)參數(shù)函數(shù)的參數(shù)可以是變量、變量地址、數(shù)組名或指針變量。實際上函數(shù)參數(shù)為變量的地址、指針、數(shù)組名都屬于地址傳遞的方式。1 變量的地址作為函數(shù)參數(shù)。例101 變量的地址作為函數(shù)參數(shù)的例子。#include<stdio.h>void f(int *p) /*由于實參為變量的地址,形參一定是指針*/printf(“%dn”,*p);void main( )int x=5;f(&x); /*變量的地址作為實參*/解析:參數(shù)傳遞的情況如圖10.1所示,由于實參為變量的地址,形參一定是指針,因為只有

2、指針才能指向變量的地址。變量x的地址傳給指針p,p的值為&x,即指針p指在x的地址上,指針p所指的地址上的內(nèi)容即為變量x的值。第10章 指針與函數(shù)圖10.1 變量的地址傳遞給指針 思考:下列程序中的函數(shù)fun是以變量的地址作為函數(shù)參數(shù)傳遞,請分析程序執(zhí)行的結(jié)果。#include<stdio.h>void fun(int *p)*p=*p>0?*p:-*p;void main( )int x;printf("input a numn");scanf("%d", &x):fun(&x); /*此函數(shù)的調(diào)用以語句的形式

3、出現(xiàn)*/printf("the absolute value is %d", x);2指針作為函數(shù)的參數(shù)。例102 指針變量作為函數(shù)參數(shù)的例子。#include<stdio.h>void f(int *p)printf(“%dn”,*p);void main( )int x=5,*p;p=&x;f(p);解析:參數(shù)傳遞的情況如圖10.2所示,由于實參為指針,形參也一定是指針,因為只有指針才能指向變量的地址。實參p指向變量x的地址,傳給指針p,p的值為&x,即指針p指在x的地址上,指針p所指的地址上的內(nèi)容即為變量x的值。C語言程序設(shè)計圖10.2 變

4、量的地址傳遞給指針例10.3 通過調(diào)用函數(shù),函數(shù)的參數(shù)為指針,在函數(shù)中交換兩數(shù)。#include<stdio.h>void swap(int *p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;void main( )int a,b;int *p1,*p2;scanf("%d,%d",&a,&b);p1=&a;p2=&b;swap(p1,p2);printf("n%d,%dn",a,b);假定程序在執(zhí)行時,從鍵盤輸入:3,5(回車),即a、b的值分別為3、5,此時調(diào)用函數(shù)swap(p1,

5、p2),在函數(shù)swap中使得指針p1、p2所指的地址上的內(nèi)容進行交換,即a、b的值交換,如圖10.3所示。第10章 指針與函數(shù)形參pp1 p2實參p1 p2(a)執(zhí)行到函數(shù)swap中語句int p;時的參數(shù)傳遞情況形參p p2 p1實參 p1p2(b)執(zhí)行到函數(shù)swap中語句*p2=p;時的參數(shù)情況實 參 a b p1 p2(c)回到main函數(shù)時,形參p、p1、p2被釋放,a、b的值已交換圖10.3 實參、形參相互關(guān)系例10.4 在main函數(shù)中讀入兩個字符串,調(diào)用自定義函數(shù)strcmp,比較兩個字符串的大小,實參用數(shù)組名,形參用指針。解析:字符串比較時,返回的是第一個不同字符的差值。因而函

6、數(shù)的返回值類型為int,函數(shù)的原型可以寫成:int strcmp(char *p1,char *p2),程序設(shè)計如下:#include<stdio.h>void strcmp(char *s1,char *s2)for(;*s1!=0;s1+,s2+)if(*s1!=*s2) break;return(*s1-*s2);C語言程序設(shè)計void main( )char str190,str290;gets(str1);gets(str2);printf("%dn",strcmp(str1,str2);思考:用指針傳遞的方式,調(diào)用一個函數(shù),求一個字符串的長度。 例1

7、0.5 在main函數(shù)中讀入一個由數(shù)字字符組成的字符串,把此字符串作為函數(shù)的參數(shù),調(diào)用此函數(shù),把它轉(zhuǎn)換為一個整型數(shù),返回到main函數(shù)。解析:用表達式*p-0把一個數(shù)字字符轉(zhuǎn)化為數(shù)字,如字符串“12”,計算1-0得到1,然后乘10,再加上2-0,程序的流程如圖10.4所示。圖10.4 程序流程圖程序設(shè)計如下:#include<stdio.h>int ctoi(char *p)int sum=0;while(*p)sum*=10;sum+=*p-0;p+;return sum;第10章 指針與函數(shù)void main( )char str5;int x;scanf("%s&q

8、uot;,str);x=ctoi(str); /* 數(shù)組名作為函數(shù)的參數(shù) */printf("x=%dn",x); 例10.6 設(shè)計一個程序,在main( )中輸入一個字符串,然后再輸入一個字符,調(diào)用一個函數(shù)void del_char(char *p,char x),刪除指針p所指字符串中的x這個字符。解析:函數(shù)的的流程圖如圖10.5所示。圖10.5 流程圖程序設(shè)計如下:#include<stdio.h>#define N 80void del_char(char *p,char x)char *q=p;for(;*p!=0;p+)if (*p!=x) *q+=

9、*p;*q='0'void main( )char cN,*pt=c,x;printf("enter a string:");gets(pt);C語言程序設(shè)計printf("enter the char deleted:");x=getchar( );del_char (pt,x);printf("The new string is :%sn",c);10.3 返回值為指針的函數(shù)函數(shù)被調(diào)用后,可以由函數(shù)中的return語句返回一個值到主調(diào)函數(shù)中。函數(shù)的返回值可以是整型值、字符值、實型值等,也可以是返回指針型的數(shù)據(jù),即地

10、址。返回值為指針的函數(shù),與以前的函數(shù)概念類似,只是返回的值的類型是指針類型而已,此類函數(shù)通常稱為指針函數(shù)。指針函數(shù)定義形式:類型名 *函數(shù)名(形參表定義)函數(shù)體如:int *func(int x,int y);其中,func是函數(shù)名,其返回值類型是“指向整型的指針”,也即函數(shù)值是一個指針,指向一個整型變量,函數(shù)的形參為int x 和int y。例10.10 由鍵盤輸入112自然數(shù),再調(diào)用指針函數(shù)輸出英文名被調(diào)用程序中應(yīng)定義指針函數(shù)。#include<stdio.h>char *month_name(int n)static char *name13="ILLEGAL&qu

11、ot;,"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBET","NOVEMBER","DECEMBER"return(n<1 | n>12)? name0:namen);void main() char *month_name

12、(int); /*說明一個指針函數(shù),由于函數(shù)定義在先,此語句可省略*/第10章 指針與函數(shù)int n;scanf("%d",&n);printf("%s",month_name(n); 例10.11 編一函數(shù),在一組字符串中找出按字典序最大的字符串。#include<stdio.h>#include<string.h>char *find_max(char *str,int n) /聲明函數(shù)返回值為指向字符的指針int i;char *p;p=str0; /假設(shè)str0及p所指向的字符串按字典序最大 for(i=1;i<n;i+)if(strcmp(stri,p)>0)p=stri; /使p指向按字典序最大的字符串return p; /返回指針值void main()char *a5="ABc","abc","Abc","abcd","abca"printf("%sn",find_max(a,5);運行結(jié)果:abcd解析:char *find_max(char *str,int n)聲明函數(shù)返回值為一個指

溫馨提示

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

評論

0/150

提交評論