C語言中文網 目錄

C語言*運算符和&運算符

取址運算符&用來取得其操作數的地址。如果操作數 x 的類型為 T,則表達式 &x 的類型是 T 類型指針(指向 T 的指針)。

取址運算符的操作數必須是在內存中可尋址到的地址。換句話說,該運算符只能用于函數或對象(例如左值),而不可以用于位字段,以及那些還未被存儲類修飾符 register 聲明的內容。

當需要初始化指針,以指向某些對象或函數時,需要獲得這些對象或函數的地址:
float x, *ptr;
ptr = &x;           // 合法:使得指針ptr指向x
ptr = &(x+1);       // 錯誤: (x+1) 不是一個左值
相反地,當已具有一個指針,并且希望獲取它所引用的對象時,使用間接運算符 *(indirection operator),有時候這會被稱為解引用運算符(dereferencing operator)。它的操作數必須是指針類型。如果 ptr 是指針,那么 *ptr 就是 ptr 所指向的對象或函數。如果 ptr 是一個對象指針,那么 *ptr 就是一個左值,可以把它(即 *ptr)當作賦值運算符左邊的操作數:
float x, *ptr = &x;
*ptr = 1.7;                                      // 將1.7賦值給變量x
++(*ptr);                                        // 并將變量x的值加1
在這個示例最后的語句中,ptr 的值保持不變,但 x 的值變成 2.7。

如果指針操作數的值不是某個對象或函數的地址,則間接運算符*的操作結果無法確定。

像其他一元操作數一樣,運算符 & 和 * 具有很高的優先級。操作數的組合方式是從右到左。因此,表達式 ++(*ptr)中的括號是沒有必要的。

運算符 & 和 * 是互補的:如果 x 是一個表達式,用于指定一個對象或一個函數,那么表達式 *&x 就等于 x。相反地,在形如 &*ptr 的表達式中,這些運算符會互相抵消,表達式的類型與值等效于 ptr。然而,不管 ptr 是不是左值,&*ptr 都一定不會是左值

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo