C語言函數指針實驗

     上次看Atmel的示例工程,發現人家使用了函數指針的結構體(函數指針結構體)。感嘆人家的C語言功夫審覈,本身費勁仍是隻能讀懂的份。不過,函數指針確實好用。今天就試試這個超牛的東西。Now let's see how function pointers can help us.html

實驗前,瞭解下函數指針的定義方法。(來自百度百科的說明數組

函數指針的聲明方法爲: 函數

函數類型 (標誌符指針變量名) (形參列表); ui

注1:「函數類型」說明函數的返回類型,「(標誌符指針變量名 )」中的括號不能省,若省略總體則成爲一個函數說明,說明了一個返回的數據類型是指針的函數,後面的「形參列表」表示指針變量指向的函數所帶的參數列表。例如: url

int func(int x); /* 聲明一個函數 */ spa

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

f=func; /* 將func函數的首地址賦給指針f */ code

賦值時函數func不帶括號,也不帶參數,因爲func表明函數的首地址,所以通過賦值之後,指針f就指向函數func(x)的代碼的首地址。 htm

注2:函數括號中的形參無關緊要,視狀況而定blog

第二步,準備實驗環境。

   MDK473+STM32F4.其實沒有必要在開發板中試,只是恰好我手上有這麼個開發環境,就不去配置別的東西了。

第三步,開始寫代碼:

    一、寫兩個功能不一樣參數類型同樣的函數。

這裏我寫了兩個函數:

uint8_t max1(uint8_t x,uint8_t y)
{
    return x>y?x:y;
}
uint8_t max2(uint8_t x,uint8_t y)
{
    if(x>y)
        return x;
    else
        return y;
}

       兩個函數同樣的功能。  

二、一個函數指針,映射其中的一個函數  看輸出。以後映射到第二個函數看輸出

實現步驟

int main(void)
{    
    mymax = &max1;
    mymax(3,5);
    
    mymax = &max2;
    mymax(4,6);

  while (1)
  {
  }
}

以後但不跟蹤進去看看,會發現兩個max函數都執行了。

        還有一種是將函數指針弄成一個數組的形式。數組的成員都是函數指針。這種寫法特別適合作接口程序。好比我先前博客裏邊提到的Atmel的(函數指針結構體)。底層函數和上層函數分開來的效果,是當底層硬件改變以後,只寫相應的接口函數就能夠掛在到原來的大程序中。比從新寫要簡單不少。

        如下是函數指針數組的實驗:

        繼續使用上邊的兩個max函數。由於函數的返回類型是相同的,因此能夠定義成數組。定義的時候只須要注意書寫的格式就好了:

int main(void)
{
    uint8_t (*myFun[2])(uint8_t,uint8_t);
 myFun[0] = max1;
    myFun[1] = max2;
    
    myFun[0](2,4);
    myFun[1](5,2);
}

運行下,能夠看到兩個max依此都執行了。

其實函數名就是個指針,指向了函數的入口地址。函數的參數什麼的,是函數名後邊的一段空間,能夠有也能夠沒有。跟這個指針沒什麼必然聯繫。

相關文章
相關標籤/搜索