[英]What in the syntax rules makes prototypes of functions that return pointers and function pointers different?
用於定義返回指針的函數的原型如下所示:
int * function_name();
同時,函數指針的原型如下所示:
int (*function_name)();
什么語法規則使這兩個定義不同? 優先權如何發揮作用?
例如,是
(int *) function_name();
返回指針或指針函數的函數原型? (我的直覺是它定義了一個返回(int *)
的函數,因此是前者。)
編輯:我意識到我的問題實際上是關於C聲明。 理解它們的一個很好的資源是http://unixwiz.net/techtips/reading-cdecl.html
什么語法規則使這兩個定義不同?
解析規則是:
[]
和()
不是*
。 因此,對於int * function_name();
,identifier function_name
將使用()
而不是*
,因此function_name
被聲明為返回指向int
指針的函數。
對於int (*function_name)();
,額外的外括號force function_name
附帶*
而不是()
。 因此,這將function_name聲明為指向返回int
function_name
的指針。
(int *) function_name();
不能在功能之外使用。 編譯器將報告語法錯誤。 看到(int *)
編譯器將解釋為一個強制轉換操作符,並將function_name()
為函數調用。
進一步閱讀: 解密復雜的聲明,如void ( *( *f[] ) () ) ()
。
(int *) function_name();
作為函數原型是語法錯誤。
調用function_name();
這樣,它將返回值強制轉換為int *
:
int main(void) {
(int *) function_name(); //the return value is being casted to an `int *`
return 0;
}
以下是一個返回指針的函數:
int *function_name();
以下是函數指針,即指向函數的指針:
int (*function_name)();
讓我引用一下:
當有更多的星星投入時,人們有時會感到困惑:
void *(*foo)(int *);
在這里,關鍵是要從里到外閱讀; 注意表達式的最內層元素是* foo,否則它看起來像一個普通的函數聲明。 * foo應該引用一個返回void *並接受int *的函數。 因此,foo是指向這樣一個函數的指針。
好的,所以應用讀取C聲明的規則(例如這里 ):
int * function_name();
將function_name聲明為返回指向int
的指針的函數,而
int (* function_name)();
將function_name聲明為返回int
的函數的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.