函數指針的聲明


typedef函數指針的聲明與其他類型的聲明有所不同,主要遵守右左法則,具體的解釋如下:

1.1 解讀的原則---右左原則:
右左法則:首先從最里面的圓括號看起,然后往右看,再往左看。每當遇到圓括號時,就應該掉轉閱讀方向。一旦解析完圓括號里面所有的東西,就跳出圓括號。重復這個過程直到整個聲明解析完畢。
個人認為最開始應該是從需要定義的標識符開始閱讀(當然有可能所有的需要定義的標識符都是在圓括號內的),因為一個聲明中可能有多個標識符,但是未定義的標識符永遠只有一個。
注:函數的返回值不能是一個數組。數組的元素類型必須一樣,同時他們占用的空間也必須一樣,所以數組內不能存放函數。
通過以下的例子討論右左法則:

int (*func)(int *p) ;
  首先找到未定義的標識符,就是func,它的外面有一對圓括號,而且左邊是一個*號,說明func時一個指針,然后跳出這個圓括號,先看右邊,也是一個圓括號,這說明(*func)時一個函數,而func是一個指向這類函數的指針,就是一個函數指針,這類函數具有int*類型 的形參,返回值類型是int。
int (*func)(int *p, int (*f)(int*));
  func被一對括號包含,且左邊有一個*號,說明func是一個指針,跳出括號,右邊有一個括號,那么func時一個指向函數的指針,這類函數具有int *和int (*)(int *)這樣的形參,返回值為int類型,看一下func的形參int (*f)(int*),類似前面的解釋,f也是一個函數指針,指向的函數具有int*類型的形參,返回值為int。
int (*func[5])(int *p);
  func右邊是一個[ ]運算符,說明func是一個具有5個元素的數組,func左邊有一個*,說明func的元素是指針,這里的*是修飾func[5]而不是func的,應為[]運算符的優先級比*高,所以func先與[]先結合。跳出這個括號,右邊也是一對圓括號,說明func數組的元素是函數類型的指針,它所指向的函數具有int*類型的形參,返回值類型為int。
int (*(*func)[5])(int *p);
  func被一個圓括號包含,左邊又有一個*,那么func是一個指針,跳出括號,右邊是一個[]運算符號,說明func是一個指向數組的指針,現在往左看,左邊有一個*號,說明這個數組的元素是指針,再跳出括號,右邊又有一個括號,說明這個數組的元素是指向函數的指針。總結一下,就是:func是一個指向數組的指針,這個數組的元素是函數指針,這些指針指向具有int*形參,返回值為int類型的函數。
int (*(*func)(int *p))[5];
  func是一個函數指針,這類函數具有int*類型的形參,返回值是指向數組的指針,所指向的數組的元素是具有5個int元素的數組。

要注意有些復雜指針聲明是非法的,例如:

int func(void) [5];
  func是一個返回值為具有5個int元素的數組的函數。但C語言的函數返回值不能為數組,這是因為如果允許函數返回值為數組,那么接收這個數組的內容的東西,也必須是一個數組,但C語言的數組名是一個右值,它不能作為左值來接收另一個數組,因此函數返回值不能為數組。
int func[5](void);
  func是一個具有5個元素的數組,這個數組的元素都是函數。這也是非法的,因為數組的元素除了類型必須一樣外,每個元素所占用的內存空間也必須相同,顯然函數是無法達到這個要求的,即使函數的類型一樣,但函數所占用的空間通常是不相同的。

參考:http://bbs.csdn.net/topics/330141754/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM