首先說一下數組指針和函數指針的定義問題。
一條重要的規則:函數和數組修飾符的優先級比指針修飾符的優先級高。函數的修飾符為()、數組的修飾符為[]、指針的修飾符為*。
eg:
int *A[N]: 等價于(int*)(A[N]):A[N]表示有N個元素的數組。元素類型為int*
int (*A)[N]:因為有括號提高了*的優先級。所以等價于int ((*A)[N])。表示A是一個指針。A指向的是含有N個元素的數組。數組中存放的元素為int型。
對于指向函數的指針。
int (*afp2[N])(); afp2[N]表示afp2是個含有N個元素的數組。數組中的元素為指向返回值為int、無參數的函數指針。
因為函數的聲明較為復雜。可以用typedef來使代碼更加明確。
我們用typedef來改寫上面的聲明。
typedef int (*FP)();//定義FP為返回值為int、參數列表為空的函數的類型。
FP afp2[N];//含有N個元素的數組,返回值為FP。
將一個函數的地址初始化或賦值給一個指向函數的指針時,無需顯示的取其地址。編譯器知道隱式的取其地址。
void*可以指向任意類型的數據。
不存在可以指向任意類型函數的通用指針。