C語言:結構體中(.)和(->)的區別


https://blog.csdn.net/faihung/article/details/79190039

這雖然是個小問題,但有時候很容易讓人迷惑,因為有的時候用混淆了,程序編譯不通過。

下面說說我對它們的理解。

一般情況下用“.”,只需要聲明一個結構體。格式是,結構體類型名+結構體名。然后用結構體名加“.”加域名就可以引用域 了。因為自動分配了結構體的內存。如同 int a;一樣。

而用“->”,則要聲明一個結構體的指針,還要手動開辟一個該結構體的內存,然后把返回的指針給聲明的結構體指針,才能用“->”正確引用。否則內存中只分配了指針的內存,沒有分配結構體的內存,導致想要的結構體實際上是不存在。這時候用“->”引用自然出錯了,因為沒有結構體,自然沒有結構體的域了。

此外,(*a).b 等價於 a->b。

"."一般情況下讀作"的”。

“->”一般讀作"指向的結構體的"。

https://blog.csdn.net/alidada_blog/article/details/80353343

一直以為這兩個是沒有什么區別的,可以相互替換,今天又翻了一下《C語言核心技術》,明白了其中的奧妙。 

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

不同點:點操作符左邊的操作數是一個“結果為結構”的表達式;

                箭頭操作符左邊的操作數是一個指向結構的指針。

舉例說明:

#include <string.h>

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)

{

  strcpy( pSong ->composer,"123");

  pSong->duration = 251;

 ...

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM