[英]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)
,或*foo
或foo
等效 等等。
這意味着您可以在函數名稱之前合法地添加任意數量的*
而不更改其含義。 但是,沒有理由這樣做。
為什么在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.