下午突然發憤決定搞定複雜指標的相關問題,看了幾篇大大們的文章後,感覺略有收穫。
個人的總結:從非保留字讀起,如果有多個非保留字(如函式指標中的形參名,雖然這並沒有必要),從最左邊的讀起。此後,如果遇到右括號,則向左讀。如果遇到左括號,則向右讀,讀完所有括號後再按優先順序分析一次。
我們來試一試,我會說的詳細些。
int *(*(*func)(void *))[5];
只有乙個非保留字func,從它讀起。
宣告乙個叫func的東西。
遇到右括號,向左讀。
這個func是乙個指標。
遇到左括號,向右讀,跳過已經被分析的部分,遇到左括號,繼續向右。
這個指標指向乙個函式,函式接受void指標。
讀到右括號,向左讀。
函式返回乙個指標。
此時所有的括號都分析完成,剩下的就很簡單了。
[5]說明這個指標指向乙個含有5個元素的陣列。
*說明這個陣列內的元素是指標。
最後int說明指標指向int資料型別。
最後總結:func是乙個指向函式的指標,函式接受void指標,返回指向陣列的指標,陣列由5個int指標組成。
如果沒暈的話,可以自行嘗試下面的宣告。答案可以用小刀用力刮開。
int (*(*func)[5])(void *);
func是乙個指標,指向乙個有5個元素的陣列,每乙個元素都是乙個指向函式的指標,函式接受void型指標,返回乙個int值。
宣告理解的差不多了,那怎麼呼叫呢?
#includeusing namespace std;
int (*(*func)[5])(void *);
int a(void *pa)
int b(void *pb)
int c(void *pc)
int d(void *pd)
int e(void *pd)
int main()
既然func是乙個指向陣列的指標,那如果想運算元組內的元素,當然要先用"*"將func退成陣列。
然後,再加上下標,同時用括號更改優先順序,就變成了乙個個指向函式的指標,我們再賦給它函式的位址,就能呼叫了
按照我的預期,它應該輸出3。
不過呢,發現程式崩潰了。
debug發現程式連第一步都沒走完。
不由得懷疑自己是不是完全理解錯了。於是在watches中查詢對應的資料
重新讀了一下自己的程式,發現問題了……
func是【大段定語】指標啊!
不管定語有多長它都是個指標啊!!
沒初始化位址啊!!!
野指標啊!!!!
由於隱式初始化的關係,倒也談不上危險,不過無法執行是肯定的了。
改進如下。
#includeusing namespace std;
int (*(*pfunc)[5])(void*);
int a(void *pa)
int b(void *pb)
int c(void *pc)
int d(void *pd)
int e(void *pd)
int main()
額外宣告了乙個陣列,與指標相對應。
取這個陣列的位址賦給指標。
再把陣列內元素分別賦以函式位址,這裡分別用直接法和間接法賦位址。
這樣就不會出事故了。
總之是千萬要注意
野指標。
記一次複雜查詢
專案中有乙個需求,查出使用者取出,充值次數,金額,使用者名稱,金幣的總量和每局遊戲的盈虧等做乙個統計,而他們分布在個表中,分別是使用者表,使用者取出表,使用者充值表,每局遊戲表中。首先想到的就是要分組查詢,group by user.userid.因為有的使用者有充值記錄但不一定有取出記錄,所以需要...
記一次複雜的sql server xml欄位查詢
專案中一直使用 no sql 的方式將entity序列化成xml格式儲存在sql server資料庫表的xml欄位中,最近終於要對資料進行遷移了,需要將資料遷移回關係型格式,因此也經歷了一次比較有趣而又複雜的xml查詢。具體問題是這樣的。資料庫中有一張entitystate表用於儲存應用中所有被xm...
記一次網路實驗課
final exam 一.實驗目的 二.實驗過程 1.先分別給交換機1,2,3和做pc的兩個路由器命名 sy h3c sysname sw1 2.先給sw1配上vlan 2,vlan3並給每個vlan介面分配ip位址 sw1 vlan 2 sw1 vlan2 vlan 3 sw1 vlan3 int...