C語言:存取結構體成員的點運算子(.)和箭頭運算子(->)的區別
阿新 • • 發佈:2018-12-17
一直以為這兩個是沒有什麼區別的,可以相互替換,今天又翻了一下《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;
…
}