記一次實驗 複雜函式指標的呼叫

2021-07-07 02:34:37 字數 1797 閱讀 5643

下午突然發憤決定搞定複雜指標的相關問題,看了幾篇大大們的文章後,感覺略有收穫。

個人的總結:從非保留字讀起,如果有多個非保留字(如函式指標中的形參名,雖然這並沒有必要),從最左邊的讀起。此後,如果遇到右括號,則向左讀。如果遇到左括號,則向右讀,讀完所有括號後再按優先順序分析一次。

我們來試一試,我會說的詳細些。

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...