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;
...
}
