C語言中文網 目錄

C語言點運算符和箭頭運算符

二元運算符 . 和 -> 常常被稱為點運算符(dot operator)和箭頭運算符(arrow operator),借助于這兩個運算符,可以選擇結構或聯合中的成員。

例 1 展示了點運算符的左操作數必須是一個結構或者一個聯合,而右操作數必須是該類型(結構或聯合)成員的名字。

【例1】
struct Article {  long number;      // 物品編號
                  char name[32];    // 物品名字
                  long price;       // 物品單價(精確到美分)
                  /* ... */
                };
struct Article sw = { 102030L, "Heroes", 5995L };
sw.price = 4995L;                   // 將價格改為49.95

點運算結果的類型,與所選擇成員的類型是一樣的。如果左操作數是一個左值,那么該運算也會產生左值。如果左操作數的類型有限定符(例如被聲明為 const),那么結果類型也有該限定符。

點運算符的左操作數并非一定是左值,如下例所示:
struct Article getArticle();                      // 函數原型
printf( "name: %s\n", getArticle().name );

函數 getArticle()返回一個 struct Article 類型的對象。按此結果,getArticle().name 是一個有效的表達式,但不是一個左值,因為函數的返回值不是一個左值。

運算符 -> 也可用于選擇結構或聯合的成員,但是箭頭運算符的左操作數必須是一個指針,它指向一個結構或聯合類型右操作數是該結構或聯合成員的名字。例 2 展示了運算符->的用法,同樣使用例 1 所定義的結構 Article。

【例2】
struct Article *pArticle = &sw,     // 一個指向struct Article的指針
       const *pcArticle = &sw;      // 一個指向struct Article的只讀指針

++(pArticle->number);                    // 增加編號
if ( pcArticle->number == 102031L ) // 正確:獲取只讀指針
  pcArticle->price += 50;        // 錯誤:不能使用限定符const的指針來修改對象

箭頭運算符的結果總是一個左值。它具有被選取成員的類型,也同樣包括了其指針操作數的任何類型限定符。在例 2 中,pcArticle 是一個指向 const struct Article 的指針。其結果是,表達式 pcArticle->price 是一個常量。

包含箭頭運算符的任何表達式,都可以利用點運算符進行重寫,做法是先將指針解參考,然后使用點運算符:表達式 p->m 等效于(*p).m;相反地,如果 x 是左值的話,表達式 x.m 等效于(&x)->m。

和運算符 [] 一樣,點運算符 . 和箭頭運算符 -> 都具有最高的優先級,并且組合方式都是從左到右。因此,表達式 ++p->m 等同于 ++(p->m),表達式 p->m++ 等同于(p->m)++。

然而,表達式(*p).m 中的括號是有必要的,因為復引用運算符 * 的優先級比較低。表達式 *p.m 等效于 *(p.m),這種等效僅當在成員 m 是指針時才有意義。

我們通過結合下標運算符、點運算符和箭頭運算符,對一個元素為結構的數組進行操作,來總結本文講述的問題:
struct Article arrArticle[10];       // 一個具有10個元素的數組
                                                // 每個元素為結構類型
arrArticle[2].price = 990L;             // 設置數組元素arrArticle[2]的成員price
arrArticle->number = 10100L;         // 設置數組元素arrArticle[0]的成員number

一個數組名稱,例如本例中的 arrArticle,是一個指向第一個數組元素的常量指針。所以 arrArticle->number 指向第一個數組元素的成員 number。簡單地說,對于任一的索引值 i,下面 3 個表達式是等價的:
arrArticle[i].number
(arrArticle+i)->number
(*(arrArticle+i)).number
它們都指向數組中索引值為 i 的元素的成員 number。

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

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

底部Logo