回答
在一般情況下,你必須關心的優先級都與操作符的結合:table
在這種情況下,解引用和轉換運算符具有相同的優先級,都是從右到左associatives。這意味着每個運算符都適用於其右側的內容,並且由於它們具有相同的優先級,所以取消引用運算符將應用於右側的投射運算符之後。
所以執行的操作順序是:訪問一個 - >將其轉換爲(float *) - >解引用它。
編輯:在你有一元運算符(取消引用,轉換,否定等)的情況下,該運算符總是從右到左聯合,並且在計算右側的所有表達式後應用。因此,在我們的案例中,您可以說操作員從右向左應用,而不必查看上表。
我不確定優先級與此處有關 - 左側的'*'可應用於(語法上)的** only **是'(float *)a'的結果。 –
謝謝! @Davide Visentin –
'(int *) - >(float *)'也許。 – sjsam
*(float *)a
不是聲明;它是演員表達。在這種特殊情況下,它取值a
,將其視爲指向float
的指針,並取消引用結果。最有可能的是a
是一個指向不同類型的指針,我們希望將其作爲指向float
的指針。
至於指針聲明而言...
一個簡單的指針聲明看起來像
T *p; // p is a pointer to T
其中T
是任何類型的(潛在地與像const
或volatile
限定符)。 對象p
的類型是「指向T
」的指針;該類型由T
和聲明者*p
中的類型說明符和限定符的組合完全指定。
聲明器引入聲明的名稱以及類型說明符中未提供的任何類型信息。在上面的聲明*p
是聲明者。它提供對象的名稱(p
)和任何附加類型信息(指向)。請注意,即使你寫的聲明作爲
T* p;
這將是解析作爲
T (*p);
同樣的事情適用於陣列的聲明和函數:
T a[N]; // a is an N-element array of T
T f(); // f is a function returning T
數組a
的性質由聲明者a[N]
給出,給出f
的函數性由申報人f()
提供。
您可以[]
和()
結合*
,就像這樣:
T *a[N]; // a is an N-element of pointers to T
T (*a)[N]; // a is a pointer to an N-element array of T
T *f(); // f is a function returning pointer to T
T (*f)(); // f is a pointer to a function returning T
在這兩個聲明和表達式,一元*
具有較低的優先級比任何後綴[]
或()
,所以*a[N]
和*f()
是解析如*(a[N])
和*(f())
。如果您希望a
是指向數組而不是指針數組的指針,則必須將*
與a
明確分組爲(*a)[N]
。
您可以進一步結合這些元素,像這樣:
T **p; // p is a pointer to a pointer to T
T a[N][M]; // a is an NxM array of T
T (*f[N])(); // f is an array of pointers to functions returning T
T (*f())[N]; // f is a function returning a pointer to an array of T
T *(*(*a[N])())(); // a is an array of pointers to functions returning pointers to functions returning pointers to T
是,函數可以返回指向數組和指針等功能,是的,語法看起來時髦,但如果從如何聲明符的工作邏輯如下。你只需替換函數調用的指針名稱(以及任何參數):
T (*a)[N] => T (*f())[N], a => f()
T (*f)() => T (*g())(), f => g()
這裏有一個例子:從C標準庫中的signal
功能。這是一個返回一個指向另一個函數的函數:
void (*signal(int sig, void (*func)(int)))(int);
要閱讀該聲明,最左邊標識符開始,然後出路,應用上面給出的優先級規則。遞歸應用這些規則的任何功能參數:
signal -- signal
signal( ) -- is a function taking
signal( sig ) -- parameter sig
signal(int sig ) -- is an int
signal(int sig, func ) -- parameter func
signal(int sig, (*func) ) -- is a pointer
signal(int sig, (*func)( )) -- to a function taking
signal(int sig, (*func)( )) -- unnamed parameter
signal(int sig, (*func)(int)) -- is an int
signal(int sig, void (*func)(int)) -- returning void
*signal(int sig, void (*func)(int)) -- returning a pointer
(*signal(int sig, void (*func)(int)))( ) -- to a function taking
(*signal(int sig, void (*func)(int)))( ) -- unnamed parameter
(*signal(int sig, void (*func)(int)))(int) -- is an int
void (*signal(int sig, void (*func)(int)))(int); -- returning void
所以,signal
是返回一個指向函數的函數。 signal
需要兩個參數,一個是普通的int
,另一個是指向一個函數的指針,該函數需要一個int
並返回void。請注意,在功能聲明中,不必指定參數名稱。他們需要在相應的功能定義中指定。
什麼是例如:(float *)xfunction(x,y,z)? @John Bode –
@M_sansa - 它是一個函數*調用*,並將返回值轉換爲指向'float'的指針。 –
- 1. C++:聲明指針
- 2. C++ 11 decltype:如何聲明指針指向的類型?
- 3. 將指針聲明爲類成員C++
- 4. 指針聲明
- 5. 將sigaction聲明爲值類型的指針類型
- 6. C++指定與數據類型聲明
- 7. C++指針 - 衝突的聲明和指針到指針
- 8. 如何在C中聲明C++指針#
- 9. 聲明與指針
- 10. 在類聲明中聲明一個類對象的指針
- 11. 如何根據泛型類型聲明指針?
- 12. C++中的函數指針聲明
- 13. C++成員函數指針,聲明
- 14. 指針:C++需要的所有聲明
- 15. C++指針Defererence聲明語法
- 16. 類聲明導致空指針異常
- 17. C++抽象類型聲明
- 18. C#匿名類型聲明
- 19. C類型聲明intN_t
- 20. 聲明指針變量的不同類型
- 21. 智能指針,類型定義和前向聲明
- 22. 晦澀的指針聲明
- 23. 什麼是指針聲明?
- 24. 聲明const指針爲int?
- 25. 聲明函數指針
- 26. 疑函數指針聲明
- 27. 聲明函數指針
- 28. 關於指針聲明
- 29. C指針類型鑄造
- 30. 如何在C++中聲明extern類指針?
這不是一個聲明。它將一個變量'a'解引用到指向'float'的指針。 –
@EugeneSh。請詳細解釋一下!謝謝:) –
[C++中指針變量和引用變量之間的區別是什麼?](可能是C++中的指針變量和引用變量之間的區別是什麼?)(http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer -variable-and-a-reference-variable-in) – RCB