読者です 読者をやめる 読者になる 読者になる

【C】構造体における.と->の区別(+関数引数との関連)

 自分が初めてプログラム書いた時、.(ドット演算子)と->(アロー演算子)の区別があまりついておらず苦労しました。
 復習してみるととても単純でしたが……。
 当時ググったり本を探したりしていたときは、わかりやすい例文を見つけられなかったので、備忘も兼ねて自分で書くことにしました。

・説明
・.は、通常の構造体変数の要素にアクセスするときに使用します。
・->は、ポインタ変数として宣言した構造体変数の要素にアクセスするときに使用します。
・ポインタ変数として宣言された構造体変数hogeについて、hoge->fugaの型は構造体タグ名を宣言したときの型と同じです。
 (僕はint→int*になると最初思ってました。(バカ)
 したがって関数の引数にポインタ変数が指定されているときにhoge->fugaをいれたいときは、&をつけます。

あとは例文を見てください。

ソースコード

#include <stdio.h>
typedef struct{
    int year;
    int classno;
}CLASSNAME;

void hyoji(int *);
void hyojis(CLASSNAME *);

int main(void){
    CLASSNAME cn1;
    CLASSNAME *pcn;
    pcn = &cn1;
    
    cn1.year = 3;
    printf("①:%d\n", cn1.year);
    pcn->classno = 4;
    printf("②:%d\n", pcn->classno);
    
    printf("③:");
    hyoji(&cn1.year);
    printf("④:");
    hyoji(&pcn->classno);
    
    printf("⑤:");
    hyojis(pcn);
    printf("⑥:%d\n", pcn->classno);
}

void hyoji(int *year){
    *year = 5;
    printf("%d\n", *year);
}

void hyojis(CLASSNAME *stp){
    stp->classno = 6;
    printf("%d\n", stp->classno);
}

出力結果

①:3
②:4
③:5
④:5
⑤:6
⑥:6

・参考
C言語関連
異なる型の変数をまとめる
構造体の引数

はてな記法(今回はじめて使いました)
sue445.hatenablog.com