指針函數與函數指針的區別


1、指針函數:本質是一個函數。函數返回類型是某一類型的指針

    格式:  類型標識符    *函數名(參數表)

                   int *f(x,y);

 

float *fun();

float *p;

p = fun(a);

 

 

int* find(void);

int * find(){

     int *pp ;
      pp= 0;
    return pp;
    
}

int main(int argc, const char * argv[]) {

    int *pp ;
    pp = find();

    return 0;
}

 本質是函數 只是這個函數返回的是一個執行某一類型數據的指針;

 

2、函數指針是指向函數的指針變量,即本質是一個指針變量

     格式:類型說明符 (*函數名)(參數)

                int (*f) (int x); 

    指向函數的指針包含了函數的地址,可以通過它來調用函數

   其實這里不能稱為函數名,應該叫做指針的變量名。這個特殊的指針指向一個返回整型值的函數實現地址。指針的聲明筆削和它指向函數的聲明保持一致。

 

int  xMax(int a,int b){
    return a>b?a:b;
    
}
int main(int argc, const char * argv[]) {

    
    int (*xMaxValue)(int a,int b) = &xMax;// &可以省略
    
    int d = xMaxValue(xMaxValue(2,4),3);
    printf("最大的數字是: %d\n", d);
}

 

   

  指針名和指針運算符外面的括號改變了默認的運算符優先級。如果沒有圓括號,就變成了一個返回整型指針的函數的原型聲明。

   辨別方式就是看函數名前面的指針*號有沒有被括號()包含,如果被包含就是函數指針,反之則是指針函數。

3、回調函數

函數指針作為某個函數的參數

 

函數指針變量可以作為某個函數的參數來使用的,回調函數就是一個通過函數指針調用的函數。

簡單講:回調函數是由別人的函數執行時調用你實現的函數。

// 回調函數
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}
 
// 獲取隨機值
int getNextRandomValue(void)
{
    return rand();
}
 
int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    for(int i = 0; i < 10; i++) {
        printf("%d ", myarray[i]);
    }
    printf("\n");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM