一直對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)就是函數指針
*/