簡體   English   中英

在函數調用中使用多個星號有什么用?

[英]What's the use of multiple asterisks in the function call?

我想不出函數調用中多個星號的任何實際用法:

void foo(int a, char b)
{

}

int main(void)
{
    (**************foo)(45, 'c');

    //or with pointer to function:
    void (*ptr)(int, char) = foo;
    (******ptr)(32, 'a');
}

為什么在C和C ++中都允許這個東西?

C和C ++中的標准轉換之一是函數到指針的轉換; 當函數名出現在表達式中時,它可以轉換為指向該函數的指針。 所以:

  • foo相當於&foo
  • *foo相當於*(&foo)foo
  • **foo**(&foo) ,或*foofoo等效

等等。

這意味着您可以在函數名稱之前合法地添加任意數量的*而不更改其含義。 但是,沒有理由這樣做。

為什么在C和C ++中都允許這個東西?

我不能代表C ++,但對於C,至少將函數指示符轉換為指針:

6.3.2.1 - 4

函數指示符是具有函數類型的表達式。 除非它是sizeof運算符或一元&運算符的操作數,否則具有類型''函數返回類型''的函數指示符將轉換為具有類型'' 指向函數返回類型 '的指針的表達式。

應用間接運算符會產生一個函數指示符:

6.5.3.2 - 3

一元*運算符表示間接。 如果操作數指向函數,則結果是函數指示符

因此,無論您應用間接運算符多少次,您都會得到相同的東西:一個立即轉換為指針的函數指示符。


在我看來,這樣做很少或沒有用。

因為*運算符需要一個地址值。 每當一個值出現時(與一個對象或函數glvalue相反),rvalue的左值,指針和數組到指針轉換的函數都應用於一個操作數。 因此,當再次取消引用時,解除引用的函數立即再次轉換為指針。

這些都是從對象讀取值或產生分別引用數組或函數開頭的指針值。

除了它的lulz之外,這些dereferences行沒有任何目的。

我理解的方式是

* is a pointer to a memory address
& is the value at the Memory address

*foo means pointer to foo memory address
**foo means *(*foo) *(foo memory address) This is a different value from *foo

它繼續這樣......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM