C 語言中, 與 有什麼區別?

時間 2021-05-11 23:03:35

1樓:三才朝元

在有結構體變數名的時候可以用 .

在只有結構體指標的時候還是用->比較好,這時候用(* ). 總覺得很奇怪

2樓:

點運算子(.)左邊為結構體名稱。

箭頭運算子(->)左邊為結構體指標。

如下:typedef struct定義乙個結構體型別:DATAchar key[10結構體成員:key

char name[20結構體成員:nameint age結構體成員:age

}DATADATA data宣告乙個結構體變數DATA *pdata宣告乙個指向結構體的指標訪問資料操作如下:

data.age = 24結構體變數通過點運算子( . )訪問pdata->age = 24指向結構體的指標通過箭頭運算子( -> )訪問

3樓:

假設現在定義乙個節點

typedef struct Node

Node;

宣告節點的時候,如果是宣告的普通節點

如Node nd;

那麼使用的時候就用.

比如x=nd.data;

如果宣告的是指標型變數

如Node *nd;

那麼使用的時候就用->

比如x=nd->data;

4樓:

為了便於理解算不算乙個理由?

比如乙個結構體陣列,a[10]宣告了以後,你要是寫乙個

( *(a[6]) )->m = 1;

你猜強迫症怎麼想。雖然大家都喜歡用->

5樓:

依稀記得是一句話就能解決這個問題(太久遠了,不知道對不對):

"->"等於"*"加"."

6樓:正逍遙0716

C語言是面向機器的,雖然一般我們也把它劃入高階語言,但本質還是很底層的,你看看它與Verlog之類的那麼像就知道了。所以C語言裡有很多繁瑣的地方,比如這裡是個結構體,那裡是個結構體的指標,按照C的思想需要顯式的告訴機器,於是就有了 (*s).f 這樣醜陋的寫法,於是就有了->這種雖沒本質區別但棄之可惜的語法糖,歷史遺留又不能改,導致語言設計嚴重不正交。

說實話你既然思考了這個問題,那麼一定要去用用Go!已經習慣了C的思想並且不提出質疑的人可能會覺得Go很難理解,比如為毛指標與結構體界線那麼模糊,為毛結構體可以直接傳值並且唯讀時位址沒變,為毛方法接收者是結構體時指標上也能訪問之類。但如果忘記C的那一套重新思考,這些細節的設定才是最直觀、最合理的,才是面向程式設計師的,我用了Go後再也回不到C了。

而且Go本身又保持了語言核心的最小化,並沒有新增太多太華麗的東西(我是指在一般來說用C適用場景範圍內。Go的Chanel、Goroutine之類的那是相當高等的,但一般C場景用不到,只需要Go的乙個子集),保留了指標、結構體這些底層的東西,就算有時不得不用C時,很多地方也可以盡量照著Go的思路來實現,比如通過結構體繫結方法的指標,通過組合來實現真.物件導向的抽象,通過單例模組暴露與隱藏方法防止命名衝突等,真的是讓人感覺寫起來順手多了。

回過頭再看C,會發現Go可能就是C的一種更完美的實踐。

最後,別忘了Go可是一樣直接編譯到目標機器二進位制的,沒有虛擬機器、直譯器之類的束縛,大部分場景都能接手過來,只要優化下去,在有GC的語言絕對是最能接近C效率的。

真的很欣慰看到有人出來質疑C本身一些確實的缺陷了,一激動就強推了一波Go,若有錯漏之處還望海涵。

7樓:Freder

「->」用於解決「*」與「.」的優先順序問題。

人們常誤以為*p.f的意思是(*p).f,而實際是*(p.f)。(但c裡面還有很多優先順序問題沒有給出解決,所以還是噴吧2333

如果你樂意,可以不用「->」。(拙見

8樓:YorkYoung

就是歷史原因啊,以前有用現在沒有的東西多了,你看GO的指標就直接上.的

當然硬要編個理由也有,那就是指標的指標怎麼算啊,能不能用.啊?(腦子正常的設計者肯定會規定不能)

順便C++區別兩個操作是有意義的,因為.不可過載,->可以過載,因此我們可以定義「假指標」,比較經典的當然就是shared_ptr這種智慧型指標了,如果把兩個混為一體了,那麼乙個shared_ptr自己真正的成員(乙個資料的指標和乙個指向引用計數的指標)和它假裝乙個指標指向的成員又怎麼區別呢?

9樓:Milo Yip

還是有一點細微的區別,參考 Member access operators:

Member access()

The member access expression designates the named member of the struct or union designated by its left operand.It has the same value category as its left operand.Member access through pointer(b}" eeimg="1"/>)

The member access through pointer expression designates the named member of the struct or union type pointed to by its left operand.Its value category is always lvalue.

就是說 可能是 lvalue 也可能是 non-lvalue(按 a 決定);而 b}" eeimg="1"/>必然是 lvalue。

typedef

structA;

Af();

returna;

}A*g

();return&a

;}intmain

()不過這種區別幾乎可以忽略。

一般使用來說,就是 b}" eeimg="1"/>寫起來比 簡單一些。

10樓:Cyandev

T* 和 T 是兩個完全不同的型別,T 型別可能有乙個 foo 方法,可以用 obj.foo() 來呼叫,而 T* 實質就是乙個 size_t 型別,它不具有任何方法,通過 * 運算子取得 referent,就可以呼叫它的成員方法了,這時表示式是 (*pObj).foo()。

看起來比較麻煩,所以 -> 運算子誕生,實質上就是個語法糖。

11樓:Alasses.Lome

假設有乙個

class

human

.是給明確的類或者結構體的物件用的, 比如human xiao_ming;

xiao_ming.func();

-> 是給類或者結構體的指標用的, 比如

human * xiao_ming = new human;

xiao_ming -> func();

12樓:guoking

用「.」的話,只需要宣告乙個結構體。格式是,結構體型別名+結構體名。

然後用結構體名加「.」加網域名稱就可以引用域了。因為自動分配了結構體的記憶體。

如同 int a;一樣。

用->的話,要宣告乙個結構體的指標,還要手動開闢乙個該結構體的記憶體,然後把返回的指標給宣告的結構體指標。才能用->正確引用。否則記憶體中只分配了指標的記憶體,沒有分配結構體的記憶體,想要的結構體實際上是不存在。

這時候用->引用自然出錯了,因為沒有結構體,自然沒有結構體的域了。

"."我直接讀做"的」。

->我讀作"指向的結構體的"。

13樓:喬貝斯

一樣。 ->更直觀些。 就像x = x + 1; 也可以是 x += 1;沒什麼可糾結的。

工作四年多我慢慢發現,我們又不是開發語言語法的,作為使用者掌握程式設計思想才是王道,我現在感覺《資料結構》甚至可以當做哲學書來看……

14樓:xmyj

既然是C語言中,那就用結構體舉例吧。宣告乙個結構體,然後用其建立乙個結構體變數,然後建立乙個結構體型別指標。這時想要訪問結構體中的物件。

一種方法是要用結構體變數加上「.」運算子;另一種方法是用指標變數加上「->」運算子

15樓:gkmail

"."的左運算元為值,"->"的左運算元為指標.題主的感覺是對的,"."和"->"實際是可以合併為乙個操作符的,在很多新語言中對值和指標取成員已經統一為".

"了,C中保留只是一種傳統的延續.

16樓:逐光入暗

唔~FC教授說的已經很全面了,不過還有個黑科技是->可被過載,而.不行

話說……so上不是有類似問題麼https://stackoverflow.com/questions/1238613/what-is-the-difference-between-the-dot-operator-and-in-c

17樓:生公尺

指標結構體變數用 ->, 普通結構體變數用 .

假設有結構體

typedef struct mystruct;

mystruct t1;

mystruct *t2;

t2=&t1;

其中,t1的值是乙個記憶體位址,這片記憶體的大小就是整個mystruct結構體的大小(64位系統下佔12位元組),內容就是結構體的內容 a和b.當然,由於是區域性變數,所以是放到棧裡的.但是你只需要知道,這個t1指向的記憶體占用了12位元組.

t2是乙個指標,它指向了t1所在的那個記憶體位址(用&符號表示取乙個變數的位址)。t2占用的記憶體只有8位元組(乙個指標型別的大小),內容就是t1的記憶體位址,在系統裡,既可以是暫存器儲存t2的資料(即t1的位址),也可以是棧變數儲存t2的資料。

所以,t2.b是語法錯誤的,因為t2並不是乙個結構體的位址,它並沒有成員a。 t2.b在編譯器上看來,相當於取 &t2+4 所在位址的值,而不是t2+4指向的位址的值。

*t2就和t1是等價的,所以 (*t2).a == t1.a. t2->a就相當於(*t2).a.

18樓:雲天明

用.的時候你給的是立即數字址,用->的時候你給的是指標嗯當然a->b等價於(*a).b

不過還是前面這個省事

然而雖然編譯器這麼強大了,但是也不能自作主張把指標當成指標的,萬一你這裡的意思是做強制型別轉換呢

在C語言中, a N 與 a N 有什麼區別?

知了 剛好有看過這裡,嘗試著回答一下。這其實和C語言運算子優先順序有關,弄懂這一點就會比較清楚,這裡涉及兩個運算子,下標引用和間接訪問 下標引用運算子優先順序高於間接引用,所以 a N 首先是乙個陣列,而陣列的元素是指標 加上小括號之後,即在 a N 中,要先進行 運算,所以a是乙個指標,指向乙個具...

C語言和C 有什麼區別?

LeeCarry 首先實名沒有幫助 單爾博 的回答,我也不知道他自己懂不懂還是抖機靈,但是很不負責任。抖機靈後面也要加句但c 和c關係很大吧。c 之父都不敢說和c沒關係吧,而且他們重疊的面積有多大,有多少c不經修改就能在c 上面跑就不用我多說了吧。下面是正經回答題主問題 網上有很多詳細資料我就不班門...

c語言中 p a什麼意思?

Flint Stone 首先 C語言 其次這是乙個指標,指標是什麼?是控制位址的指標的常用運算子 先說後面那個,你學C語言,那麼你肯定用過scanf d n 這樣的輸入吧,n是輸入到n的位址,就是取位址符,你可以試試cout n endl 輸出是乙個位址,十六進製制的。你可以找一篇部落格好好看看。定...