簡體   English   中英

語法規則中的什么使返回指針和函數指針的函數原型不同?

[英]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

什么語法規則使這兩個定義不同?

解析規則是:

  1. 找到標識符。
  2. 總是喜歡[]()不是*

因此,對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM