2016-08-30 104 views
1

我是C語言編程中的新手。有人可以向我解釋如何「讀取」*(float*)a等聲明並逐步給出一些示例。讀取C指針類型聲明

謝謝!

+4

這不是一個聲明。它將一個變量'a'解引用到指向'float'的指針。 –

+0

@EugeneSh。請詳細解釋一下!謝謝:) –

+0

[C++中指針變量和引用變量之間的區別是什麼?](可能是C++中的指針變量和引用變量之間的區別是什麼?)(http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer -variable-and-a-reference-variable-in) – RCB

回答

1

在一般情況下,你必須關心的優先級都與操作符的結合:table

在這種情況下,解引用和轉換運算符具有相同的優先級,都是從右到左associatives。這意味着每個運算符都適用於其右側的內容,並且由於它們具有相同的優先級,所以取消引用運算符將​​應用於右側的投射運算符之後。

所以執行的操作順序是:訪問一個 - >將其轉換爲(float *) - >解引用它。

編輯:在你有一元運算符(取消引用,轉換,否定等)的情況下,該運算符總是從右到左聯合,並且在計算右側的所有表達式後應用。因此,在我們的案例中,您可以說操作員從右向左應用,而不必查看上表。

+1

我不確定優先級與此處有關 - 左側的'*'可應用於(語法上)的** only **是'(float *)a'的結果。 –

+0

謝謝! @Davide Visentin –

+0

'(int *) - >(float *)'也許。 – sjsam

0

*(float *)a不是聲明;它是演員表達。在這種特殊情況下,它取值a,將其視爲指向float的指針,並取消引用結果。最有可能的是a是一個指向不同類型的指針,我們希望將其作爲指向float的指針。

至於指針聲明而言...

一個簡單的指針聲明看起來像

T *p; // p is a pointer to T 

其中T是任何類型的(潛在地與像constvolatile限定符)。 對象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。請注意,在功能聲明中,不必指定參數名稱。他們需要在相應的功能定義中指定。

+0

什麼是例如:(float *)xfunction(x,y,z)? @John Bode –

+0

@M_sansa - 它是一個函數*調用*,並將返回值轉換爲指向'float'的指針。 –