理解c 函式指標

2021-08-15 08:41:12 字數 3266 閱讀 6052

一、函式指標(通過引數與返回值來確定乙個函式指標)

1、直接宣告

int (*pf)(string& a,string & b);   //定義pf指向引數為a,b,返回值為int型別的函式

int * pf(string&a,string &b);      //括號必不可少,此時宣告了乙個pf函式,返回值為int *型指標

2、定義(定義函式指標必須與指向的函式引數、返回值型別相同)

intfunction(string &a,string &b);   //定義例子函式

int(*pf)(string& a,string& b) = function;

int(*pf)(string& a,string& b) = &function;  //寫法等價

3、呼叫

int temp =pf("hello","bye");

int temp =(*pf)("hello","bye");   

int temp =function("hello","bye");  //寫法等價

4、函式指標也是指標

函式指標也是指標,不過不存在不同指標之間的型別轉換

函式指標是乙個4位元組的變數,其儲存的內容為函式執行位址

可以將函式指標指向nullptr(0x0000)保留位址無權操作

二、函式指標作為引數

1、函式和陣列一樣,不能作為引數,但是可以作為函式引數

2、宣告

int temp(conststring &a,int (*pf)(string &a,string &b));

int temp(conststring &a,int pf(string &a,string &b));     //第二個引數胡自動的轉換為函式指標

3、呼叫

intfunction(string &a,string &b);    //函式宣告

temp("hello",function);    //自動將函式名轉換為函式指標

temp("hello",&function)

4、利用型別別名來簡化宣告

intfunction(string &a,string &b);    //函式宣告

typedef intfunc(string &,string &);  

typedefdecltype(function) func2;     //等價都是函式型別

typedef int(*funcp)(string &,string &);

tydedefdecltype(function) funcp2;    //等價都是函式指標型別

temp("hello",func);   //自動轉換為函式指標

temp("hello",funcp);   

三、返回指向函式的指標

1、和陣列類似,不能返回乙個函式,但是能夠返回乙個函式指標

2、利用型別別名來返回函式指標

using pf = int(*)(string &,string &);

using f =int(string &,string &);  //返回值不像形參,不能自動轉換為函式指標

pftemp(int,int);   //此函式的返回值為 pf函式指標型別

f * temp(int,int); //f返回值為函式指標型別

3、原始函式宣告

int(*temp(string &,string &))(int,int);

函式temp接受雙形參string,返回接受函式雙形參int,返回值為int的函式指標

從外往內閱讀嗎,首先是內層括號,函式接收引數為string引用,往外,返回為指標,在往括號外,接收雙int引數,返  回為int

所以該函式返回為接收雙int引數返回值為int的函式指標。

4、使用尾置型別

auto temp(string&,string &) -> int(*)(int ,int);

5、使用decltype

function(int,int);

decltype(function) * temp(string &,string &);

四、宣告型別別名的三種姿勢

1、using

using f = int;

using p = int*;            

using pp = int**;

using array =int ;

using array =int* ;

using arrayp =int (*);

using arrayp =int* (*);

using f = int&;

using array =int (&);

using array =int *(&);

using func =string& (int &,int &);

using funcp =string& (*)(int &,int &);

2、typedef

typedef int f;

typedef int * p;

typedef int **p;

typedef intarray ;

typedef int*array;

typedef int*(*arrayp);

typedef int&f;

typedef int(&array);    //引用陣列

typedef int*(&array);

typedefstring& temp(int&,int&)   //函式

typedefstring& (*temp)(int&,int&)

3、decltype

decltype 是基於變數來計算型別的

const int temp;

decltype(temp)tempa;

int*(*temp)[10];

decltype(temp)tempa;

int* temp(string&a,string &b);  //函式

decltype(temp)*a;

decltype(temp)*test(int a,int b);   //函式返回函式指標

int*(*temp)(string &a,string &b);//函式指標指向雙string&形參,返回值為int *的函式

decltype(temp)a;

decltype(temp)test(int a,int b);   //函式返回值為函式指標

指標函式與函式指標理解

1 指標作為函式引數 跟傳址函式一樣的用法,形參的改變對應的實參有效。2 指標函式 指標最為函式的返回值。語法格式 資料型別 函式名 參數列 1 資料型別是函式返回的指標所指向資料的型別 2 函式名宣告了乙個指標型的函式 3 參數列是函式的形參列表 例如 int fun int a,int b 3 ...

對比理解指標函式和函式指標

1 函式指標,可以這樣理解,它首先是乙個指標變數 一般佔4個位元組 只是它將要指向的資料型別為某種形式的函式。舉例如清單1 include int int func int a,int b char char func char a,char b int main void 例子輸出結果 int f...

對比理解指標函式和函式指標

1 函式指標,可以這樣理解,它首先是乙個指標變數 一般佔4個位元組 只是它將要指向的資料型別為某種形式的函式。舉例如清單1 cpp view plain copy include int int func int a,int b char char func char a,char b int ma...