亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

函數指針的取消引用是如何發生的?

函數指針的取消引用是如何發生的?

C++ C
尚方寶劍之說 2019-07-02 17:20:26
函數指針的取消引用是如何發生的?為什么和如何取消引用一個函數指針只是“什么都不做”?這就是我要說的:#include<stdio.h>void hello() { printf("hello"); }int main(void) {      (*****hello)(); }從評論中這里:函數指針的取消引用很好,但是得到的函數指示符將被立即轉換回函數指針。從一個答案這里:刪除(以您認為的方式)函數的指針意味著:訪問代碼內存,因為它將是一個數據內存。函數指針不應該以這種方式取消引用。相反,它被稱為。我會用一個名字“取消”與“調用”并排。沒事的。無論如何:C的設計方式是,函數名標識符和變量保持函數的指針都是相同的:地址到代碼內存。它允許在標識符或變量上使用Call()語法跳轉到該內存。多么,怎樣一點兒沒錯函數指針的取消引用是否有效?
查看完整描述

3 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

這不是完全正確的問題。至少對C來說,正確的問題是

函數值在rvalue上下文中會發生什么情況?

(rvalue上下文是名稱或其他引用應該用作值的任何地方,而不是位置-基本上是在轉讓的左邊以外的任何地方)。名稱本身來自右(邊),正確的-作業的手邊。)

好的,那么在rvalue上下文中函數值會發生什么呢?它被立即隱式轉換為指向原始函數值的指針。如果取消引用指針*,您將再次獲得相同的函數值,該值將立即隱式轉換為指針。你可以隨心所欲地做很多次。

你可以嘗試兩個類似的實驗:

  • 如果取消引用lvalue背景-作業的左邊。(如果您記住函數是不可變的,那么答案將是您所期望的。)

  • 數組值也在lvalue上下文中轉換為指針,但它被轉換為指向元素鍵入,而不是指向數組的指針。因此,去引用它將給您一個元素,而不是數組,并且您顯示的瘋狂不會發生。

希望這能幫上忙。

P.S.關于為什么函數值被隱式轉換為指針,答案是對于那些使用函數指針的用戶來說,不用使用是非常方便的&也有雙重方便:調用位置上的函數指針自動轉換為函數值,因此不必編寫*通過函數指針調用。

與C函數不同,C+函數可以重載,我沒有資格評論C+中的語義是如何工作的。


查看完整回答
反對 回復 2019-07-02
?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

站在編譯器作者的立場上。函數指針具有定義良好的含義,它是指向表示機器代碼的字節塊的指針。

當程序員取消函數指針時,您會做什么?您接受機器代碼的第一個(或8個)字節并將其重新解釋為指針嗎?這樣做不起作用的幾率約為20億比1。你申報UB嗎?已經有很多這樣的事情了。還是你忽視了這一企圖?你知道答案。


查看完整回答
反對 回復 2019-07-02
  • 3 回答
  • 0 關注
  • 626 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號