c語言指針與函數(shù)_第1頁
c語言指針與函數(shù)_第2頁
c語言指針與函數(shù)_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1、指針函數(shù): 指針函數(shù)是指帶指針的函數(shù),即本質是一個函數(shù)。我們知道函數(shù)都又返回類型(如果不返回值,則為無值型),只不過指針函數(shù)返回類型是某一類型的指針。其定義格式如下所示: 返回類型標識符 *返回名稱(形式參數(shù)表) 函數(shù)體 返 回類型可以是任何基本類型和復合類型。返回指針的函數(shù)的用途十分廣泛。事實上,每一個函數(shù),即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該 地址相當于一個指針。比如函數(shù)返回一個整型值,實際上也相當于返回一個指針變量的值,不過這時的變量是函數(shù)本身而已,而整個函數(shù)相當于一個“變量”。例如 下面一個返回指針函數(shù)的例子: 例一、 #include<stdio.h&

2、gt; float *find(float(*pionter)4,int n)/*定義指針函數(shù)*/ float *pt; pt=*(pionter+n); return(pt); void main() static float score4=60,70,80,90,56,89,34,45,34,23,56,45; float *p; int i,m; printf("Enter the number to be found:"); scanf("%d",&m); printf("the score of NO.%d are:n&quo

3、t;,m); p=find(score,m); for(i=0;i<4;i+) printf("%5.2ft",*(p+i); 學生學號從0號算起,函數(shù)find()被定義為指針函數(shù),起形參pointer是指針指向包含4個元素的一維數(shù)組的指針變量。pointer+1指向score的第一行。*(pointer+1)指向第一行的第0個元素。pt是一個指針變量,它指向浮點型變量。main()函數(shù)中調用find()函數(shù),將score數(shù)組的首地址傳給pointer. 例二、將字符串1(str1)復制到字符串2(str2),并輸出字符串2 #include <stdio.h&

4、gt; #include<stdlib.h> char * mystrcpy(char * str1,char * str2) char * pr; pr=str2; if(*str2=NULL) exit(-1); while(*str1!=NULL) *str2+=*str1+; return pr; void main() char str1="I LOVE SHY" char str2="awenandy" char *p; p=mystrcpy(str1,str2); printf("%sn",p); 例三、 #

5、include<stdio.h> int * GetDate(int wk,int dy) static int calendar57= 1,2,3,4,5,6,7, 8,9,10,11,12,13,14, 15,16,17,18,19,20,21, 22,23,24,25,26,27,28, 29,30,31,-1,0 ; return (&calendarwk-1dy-1); void main() int wk,dy; do printf("Enter week(1-5)day(1-7)n"); scanf("%d %d",&a

6、mp;wk,&dy); while(wk<1|wk>5|dy<1|dy>7); printf("%d",*GetDate(wk,dy); 2 函數(shù)指針 “函 數(shù)指針”是指向函數(shù)的指針變量,因而“函數(shù)指針”本身首先應是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣, 這里是指向函數(shù)。如前所述,C在編譯時,每一個函數(shù)都有一個入口地址,該入口地址就是函數(shù)指針所指向的地址。有了指向函數(shù)的指針變量后,可用該指針變量調 用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上一致的。函數(shù)指針有兩個用途:調用函數(shù)和

7、做函數(shù)的參數(shù)。函數(shù)指針的說明方法為: 函數(shù)類型 (*指針變量名)(形參列表); “函數(shù)類型”說明函數(shù)的返回類型,由于“()”的優(yōu)先級高于“*”,所以指針變量名外的括號必不可少,后面的“形參列表”表示指針變量指向的函數(shù)所帶的參數(shù)列表。 例如: int (*f)(int x); double (*ptr)(double x); 在定義函數(shù)指針時請注意: 函數(shù)指針和它指向的函數(shù)的參數(shù)個數(shù)和類型都應該是致的; 函數(shù)指針的類型和函數(shù)的返回值類型也必須是一致的。 函數(shù)指針的賦值 函數(shù)名和數(shù)組名一樣代表了函數(shù)代碼的首地址,因此在賦值時,直接將函數(shù)指針指向函數(shù)名就行了。 例如, int func(int x)

8、; /* 聲明一個函數(shù) */ int (*f) (int x); /* 聲明一個函數(shù)指針 */ f=func; /* 將func函數(shù)的首地址賦給指針f */ 賦值時函數(shù)func不帶括號,也不帶參數(shù),由于func代表函數(shù)的首地址,因此經過賦值以后,指針f就指向函數(shù)func(x)的代碼的首地址。 與 其他指針變量相類似,如果指針變量pi是指向某整型變量i的指針,則*p等于它所指的變量i;如果pf是指向某浮點型變量f的指針,則*pf就等價于它所 指的變量f。同樣地,*f是指向函數(shù)func(x)的指針,則*f就代表它所指向的函數(shù)func。所以在執(zhí)行了f=func;之后,(*f)和func代 表同一函數(shù)

9、。 由于函數(shù)指針指向存儲區(qū)中的某個函數(shù),因此可以通過函數(shù)指針調用相應的函數(shù)?,F(xiàn)在我們就討論如何用函數(shù)指針調用函數(shù),它應執(zhí)行下面三步: 首先,要說明函數(shù)指針變量。 例如:int (*f)(int x); 其次,要對函數(shù)指針變量賦值。 例如: f=func; (func(x)必須先要有定義) 最后,要用 (*指針變量)(參數(shù)表) ;調用函數(shù)。 例如: (*f)(x);(x必須先賦值) 例一、 #include<stdio.h> int max(int x,int y) return(x>y?x:y); void main() int a,b,c; int (*ptr)(int,i

10、nt); scanf("%d,%d",&a,&b); ptr=max; c=(*ptr)(a,b); printf("a=%d,b=%d,max=%d",a,b,c); 例二、 #include<stdio.h> void FileFunc() printf("FileFuncn"); void EditFunc() printf("EditFuncn"); void main() void (*funcp)(); funcp=FileFunc; (*funcp)(); funcp=Ed

11、itFunc; (*funcp)(); ptr 是指向函數(shù)的指針變量,所以可把函數(shù)max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以后就可以用ptr來調用該函數(shù),實際上 ptr和max都指向同一個入口地址,不同就是ptr是一個指針變量,不像函數(shù)名稱那樣是死的,它可以指向任何函數(shù),就看你像怎么做了。在程序中把哪個函 數(shù)的地址賦給它,它就指向哪個函數(shù)。而后用指針變量調用它,因此可以先后指向不同的函數(shù),不過注意,指向函數(shù)的指針變量沒有+和-運算,用時要小 心。 關于函數(shù)指針數(shù)組的定義 關于函數(shù)指針數(shù)組的定義方法,有兩種:一種是標準的方法;一種是蒙騙法。 第一種,標準方法: 分

12、析:函數(shù)指針數(shù)組是一個其元素是函數(shù)指針的數(shù)組。那么也就是說,此數(shù)據結構是是一個數(shù)組,且其元素是一個指向函數(shù)入口地址的指針。 根據分析:首先說明是一個數(shù)組:數(shù)組名 其次,要說明其元素的數(shù)據類型指針:*數(shù)組名. 再 次,要明確這每一個數(shù)組元素是指向函數(shù)入口地址的指針:函數(shù)返回值類型 (*數(shù)組名)().請注意,這里為什么要把“*數(shù)組名”用括號擴起來呢? 因為圓括號和數(shù)組說明符的優(yōu)先級是等同的,如果不用圓括號把指針數(shù)組說明表達式擴起來,根據圓括號和方括號的結合方向,那么 *數(shù)組名() 說明的是 什么呢?是元素返回值類型為指針的函數(shù)數(shù)組。有這樣的函數(shù)數(shù)祖嗎?不知道。所以必須括起來,以保證數(shù)組的每一個元素

13、是指針。 第二種,蒙騙法: 盡管函數(shù)不是變量,但它在內存中仍有其物理地址,該地址能夠賦給指針變量。獲取函數(shù)方法是:用不帶有括號和參數(shù)的函數(shù)名得到。 函數(shù)名相當于一個指向其函數(shù)入口指針常量。 那么既然函數(shù)名是一個指針常 量,那么就可以對其進行一些相應的處理,如強制類型轉換。 那么我們就可以把這個地址放在一個整形指針數(shù)組中,然后作為函數(shù)指針調用即可。 完整例子: #include "stdio.h" int add1(int a1,int b1); int add2(int a2,int b2); void main() int numa1=1,numb1=2; int num

14、a2=2,numb2=3; int (*op2)(int a,int b); op0=add1; op1=add2; printf("%d %dn",op0(numa1,numb1),op1(numa2,numb2); int add1(int a1,int b1) return a1+b1; int add2(int a2,int b2) return a2+b2; 再給出常用的C變量的定義方式: a) 一個整型數(shù)(An integer) b) 一個指向整型數(shù)的指針(A pointer to an integer) c) 一個指向指針的的指針,它指向的指針是指向一個整型數(shù)

15、(A pointer to a pointer to an integer) d) 一個有10個整型數(shù)的數(shù)組(An array of 10 integers) e) 一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的(An array of 10 pointers to integers) f) 一個指向有10個整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers) g) 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to a function that takes an integer as an argument and

16、returns an integer) h) 一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)( An array of ten pointers to functions that take an integer argument and return an integer ) 答案是: a) int a; / An integer b) int *a; / A pointer to an integer c) int *a; / A pointer to a pointer to an integer d) int a10; / An array of 10 integers e) int *a10; / An array of 10 pointers to integers f) int (

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論