程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 函數指針與指針函數,函數指針指針函數

函數指針與指針函數,函數指針指針函數

編輯:關於C語言

函數指針與指針函數,函數指針指針函數


1.函數指針

指向函數的指針。本質是一個指針。

指針變量可以指向變量的地址、數組、字符串、動態分配地址,同時也可指向一個函數,每個函數在編譯的時候,系統會分配給該函數一個入口地址,函數名表示這個入口地址,那麼指向函數的指針變量稱為函數指針變量。

引論:
int sumup(int a, float b);
int (*p3) (int a, float b);    //加入p3=&sumup;則p3作為指針指向sumup。這就是p3指針指向函數
【回顧:兩者的返回值和形參都是  int    (int a, float b);】
int* (*p4)(int a, float b);
從類型上看,int*  (int a, float b) 是上式函數的指針。故有:p4 = &p3;

int (*p) (int x);       // 聲明一個函數指針

//可以通過以下兩種方式將func函數的首地址賦給指針p

p=func; 

p=&func;

取地址運算符&不是必需的,因為單單一個函數標識符就標號表示了它的地址,如果是函數調用,還必須包含一個圓括號括起來的參數表。可以采用如下兩種方式來通過指針調用函數:

x=(*p)();

x=p();    //雖然看起來和普通的調用無異,但是有些程序員傾向於使用第一種格式,因為它明確指出是通過指針而非函數名來調用函數的

如使用引論中的例子有如下的調用:
sumup (100,1.21);
(*p3) (100,1.21);      //與上等價
*(p4) (100,1.21);       //與上等價

示例程序:

void (*funcp)();
void FileFunc(),EditFunc();
 
main()
{
      funcp=FileFunc;
      (*funcp)();
      funcp=EditFunc;
      (*funcp)();
}
 
void FileFunc()
{
     printf(FileFunc\n);
 }
 
void EditFunc()
{
     printf(EditFunc\n);
} 
程序輸出為:
     FileFunc
     EditFunc

  

   

2.指針函數

指帶指針的函數,即本質是一個函數函數返回的類型某一類型的指針,即返回一個地址給調用函數,以用於需要指針或者地址的表達式中 類型標識符  *函數名(參數表)   如: 聲明:int * f(x); int *p; 調用:p=f(a);  
int * GetDate(int wk,int dy)    //返回某元素的地址
{ 
     static int calendar[5][7]={ 
         {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}
             }; 
     return &calendar[wk-1][dy-1];  
}         

main() 
{           
   int wk,dy;    
   do      
   {             
       printf(Enter week(1-5)day(1-7)\n);    
       scanf(%d%d,&wk,&dy);        
   }            
   while(wk<1 || wk>5 || dy<1 || dy>7);      
   printf(%d\n,*GetDate(wk,dy));      
}

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved