2014-03-13 154 views
-2
int *(*const fun[])(int argc, char **argv) 

這兩個函數指針聲明有什麼區別?

const int *(* fun[])(int argc, char **argv). 

是第一個常量函數指針返回整數指針的數組?

+0

當你問'cdecl',那有什麼告訴你嗎? –

+0

[cdecl](http://cdecl.org/)爲它們提供了'語法錯誤'。然而GCC不會抱怨...... – Kninnug

+1

對於cdecl來解析它,你需要刪除參數名,即使它成爲「int *(* const fun [])(int,char **)」。 –

回答

2

第一個是隻讀的指針數組(即不能更改fun[i])到功能接收intchar **,並返回一個指針int

第二個是非常相似,除了你可以改變fun[i],但它指向的函數返回一個指向只讀整數的指針。

因此,簡而言之:

/* First declaration 
int *(*const fun[])(int argc, char **argv) 
*/ 
int arg1; 
char **arg2; 
int *example = (*fun[i])(arg1, arg2); 
*example = 14; /* OK */ 
example = &arg1; /* OK */ 
fun[i] = anoter_function; /* INVALID - fun[] is an array of read-only pointers */ 

/* Second declaration 
const int *(* fun[])(int argc, char **argv) 
*/ 
const int *example2 = (*fun[i])(arg1, arg2); 
fun[i] = another_function; /* OK */ 
*example2 = 14; /* INVALID - fun[i] returns pointer to read-only value. */ 
example2 = &arg1; /* OK */ 
+0

應該將'example2'設爲'const'? – immibis

+0

@immibis絕對。感謝您指出,我解決了它。 –