C語言與C 中點運算子與箭頭運算子的區別

2021-09-30 12:58:14 字數 1638 閱讀 1152

在c++中i如果是物件,就可以通過"."來呼叫i中的成員變數。

如果i是指標的話,就不能通過"."來呼叫,而只能使用"->"來呼叫。

在c語言中不存在物件的概念。

這種情況的出現是因為使用了結構,例如

struct candybar;

在程式中

candybar snack=;

我們就可以用snack.weight來取得結構中的值。

這時是不能使用"->"來呼叫的,"->"符號指針對指標來說的。

如下情況可以使用"->"

candybar* bird;

bird->weight=2.33;

此時bird為乙個candybar結構的位址指標。所以可以使用"->",而此時就不能使用

"."來操作。因為"." "相當於"物件的成員呼叫。

首先介紹一下c++中的結構。對於乙個結構來說,

struct mystruct ;

如果有個變數mystruct s,那麼使用其中的成員元素時可以用

s.member_a = 1;

如果採用指標方法訪問,比如mystruct * ps,那麼同樣的訪問必須用箭頭號:

ps->member_a = 1;

::只用在類成員函式和類成員變數中。比如,宣告乙個類:

class ca ;

那麼在實現這個函式時,必須這樣書寫:

int ca::add(int a, int b)

另外,雙冒號也常常用於在類變數內部作為當前類例項的元素進行表示,比如:

int ca::add(int a)

表示當前類例項中的變數ca_var。

c++中當定義類物件是指標物件時候,就需要用到->指向類中的成員;當定義一般物件時候時就需要用到"."指向類中的成員.......

例如:class a

如果定義如下:

a *p則:p->play()使用; 左邊是結構指標。

a p 則:p.paly()使用; 左邊是結構變數。

相同點:兩個都是二元操作符,其右操作符是成員的名稱。

不同點:點操作符左邊的運算元是乙個「結果為結構」的表示式;

箭頭操作符左邊的運算元是乙個指向結構的指標。

舉例說明:

#include

song_t  song1,song2,                        //兩個song_t型別的物件

*psong = &song1;              //和乙個指向song_t的指標

strcpy(song1.composer,"ottma liebert");

song1.duration = 251;

song1.published.year = 1998;

if((*psong).duration >180)

printf("the song is more than 3 mimutes long.\n");

--最後一句也可以改寫為:

if(psong->duration > 180) ....

另外一點體會:如果乙個函式的傳入引數是結構體,且需要該結構體作為返回值的時候,必須採用指標傳遞的方式,其中對結構體賦值必須使用箭頭運算子。

int  isetvalue(song_t *psong)

C 中點運算子和箭頭運算子的區別

ps 需要快速看結論的,直接看文末總結歸納,需要理解的可以從文首開始看。p member執行為p offset member 目標的記憶體位址 s.member變成訪問 s offset member 目標的記憶體位址 因此實際上功能完全一致,看起來 p member更加直接一些,只不過s.memb...

C語言 運算子與 運算子

我們平時使用帶參巨集時,字串中的巨集引數是沒有被替換的。例如 輸出結果為 然而,我們期望輸出的結果是 5 20 2513 14 27 這該怎麼做呢?其實,c語言允許在字串中包含巨集引數。在類函式巨集 帶參巨集 中,號作為乙個預處理運算子,可以把記號轉換成字串。例如,如果a是乙個巨集形參,那麼 a就是...

C語言算術運算子與位運算子

1.算術操作符 前兩個不用多說,即是乘號,是求餘 取模 運算,注意 兩側運算元需均為整數 若除數與被除數符號不同,則結果符號與被除數保持一致。如 14 3 2 14 3 2 是求商運算,注意 若 的除數與被除數均為整數將執行舍位 即捨去小數中任何部分 如14 3 4 若除數與被除數符號不同,則結果符...