函數指針 指針函數 函數指針的typedef

一直對c 的知識都是懵懵的,總是用着用着 開始覺的疑惑,然後就找找資料,現在就記錄一下 函數指正 和 指針函數 的區別。

順便記一下 : 現在耳機裏的音樂是 river flows in you ---Yiruma


函數指針:本質是 指針變量  其指向的是函數

聲明: 函數返回值類型 (*指針變量名)(函數參數)  -------int (*FUNC)(int,int)

使用:FUNC =&test  假設有個函數 int test( int ,int )

實際上 FUNC ==* FCUN 在下面的程序中可以看到 它們打印的值相同

 printf("cpp_func = %p\n", cpp_func);
 printf("*cpp_func = %p\n", *cpp_func);

區別 是 FUNC 可以是左值 本質還是一個變量可以在 賦值符左邊 但是*FUNC實際上 就是一個地址值 不能作爲左值
cpp_func = (int (*)(int,int))dlsym(libCPPTest, "_Z4summii"); 是正確的
*cpp_func = (int (*)(int,int))dlsym(libCPPTest, "_Z4summii"); 是錯誤的

知乎上有見到:https://www.zhihu.com/question/29521437/answer/44649730

對於函數名:  &函數名=*函數名=函數名

對於函數指針: *函數指針=函數指針 != &函數指針

這樣說 也沒錯 但是使用時還是要 區別一下

指針函數:本質是一個函數 其返回值是一個某種類型的指針

聲明 :指針類型名 *函數名 (函數參數)    或者這樣要更專業些 =======  類型標識符 *函數名 (函數參數)

使用:通常返回一個地址 如:常用於返回數組的某個元素的地址 或 值 (可以是多維數組)

#include<stdio.h>
int *f(int *b)
{
    return (b+1);
}
int main(int argc,char** argv)
{
    int *p;
    int a[10]={1,2,3,1};
    p=f(a);
    printf("%p\n",p);     //指針
    printf("%d\n",*f(a)); //指針指向的值
    printf("%d\n",*p);    //指針指向的值
return 0;
}
//運行的結果
0xbfb09d9c
2
2

typedef:生成一個新的類型 -----用於自定的類型 系統的類型int 什麼的就不用了哈


#include <dlfcn.h>
#include<stdio.h>
int main(int argc, char **argv)
{
 void *libCPPTest = dlopen("./libTest.so", RTLD_NOW);
 typedef int (*fun)(int,int);  
	// 2  fun *cpp_func;
   //  2  *cpp_func = (int (*)(int,int))dlsym(libCPPTest, "_Z4summii");
 fun cpp_func;
 cpp_func = (int (*)(int,int))dlsym(libCPPTest, "_Z4summii");
//int (*cpp_func)(int,int) = (int (*)(int,int))dlsym(libCPPTest, "_Z4summii");
 printf("cpp_func = %p\n", cpp_func);
 printf("cpp_func output = %d\n", (*cpp_func)(10,10));
 return 0;
}
/*
1.
ct@ubuntu:~/Desktop$ ./a.out 
cpp_func = 0xb773952b
cpp_func output = 20

typedef int (*fun)(int,int)  fun 新的類型 ---不再是變量   fun 爲指針函數的類型
此時fun 可以聲明 變量
fun func1
func1 =====int (*fun)(int,int)

2.
ct@ubuntu:~/Desktop$ ./a.out 
cpp_func = 0xb7759000
cpp_func output = 20

而 fun *cpp_func; cpp_func這是一個二級指針 ,cpp_func指向的一個指針函數變量
*cpp_func = (int (*)(int,int))dlsym(libCPPTest, "_Z4summii"); *cpp_func 指針函數變量

爲什麼調用函數的時候 :
 printf("cpp_func output = %d\n", (*cpp_func)(10,10));都是用這一條語句 不會出錯呢?
 
 應該就是這個原因叭:*函數指針=函數指針
                     此時的(*cpp_func)(10,10)就是函數指針
*/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章