ポインタと構造体

 構造体の要素(メンバとも言います)にアクセスする場合、例えばtime関数で扱ったtime_t型の構造体の場合、

printf("年:%d\n", localtime(&nowDtm)->tm_year + 1900);
printf("月:%d\n", localtime(&nowDtm)->tm_mon + 1);
printf("日:%d\n", localtime(&nowDtm)->tm_mday);
printf("時:%d\n", localtime(&nowDtm)->tm_hour);
printf("分:%d\n", localtime(&nowDtm)->tm_min);
printf("秒:%d\n", localtime(&nowDtm)->tm_sec);
(抜粋)

 「localtime(&nowDtm)->tm_year」のように「->」を用いて要素にアクセスしました。しかし、前回ご紹介した独自で定義した構造体personでは、

void showStatus(struct person chara) {
    printf("名前:%s\n", chara.name);
    printf("職業:%s\n", chara.job);
    printf("レベル:%d\n", chara.lv);
    printf("HP:%d\n", chara.hp);
    printf("MP:%d\n", chara.mp);
}

 「chara.name」のように「.」を用いて要素にアクセスしました。この違いは、どこから来るものなのでしょうか。

 実は、構造体の変数がポインタで定義されたものか否かで「.」か「->」かが変わってきます。ポインタであれば「->」で、ポインタでない変数なら「.」で要素にアクセスします。下記のプログラムを作成し、確認してみて下さい。

#include <stdio.h>
#include <string.h>

struct person {
    char name[40];      // 名前
    char job[40];       // 職業
    int lv;             // レベル
    int hp;             // HP
    int mp;             // MP
};

void showStatus(struct person chara) {
    printf("名前:%s\n", chara.name);
    printf("職業:%s\n", chara.job);
    printf("レベル:%d\n", chara.lv);
    printf("HP:%d\n", chara.hp);
    printf("MP:%d\n", chara.mp);
}

void showStatusPointer(struct person *pChara) {
    printf("名前:%s\n", pChara->name);
    printf("職業:%s\n", pChara->job);
    printf("レベル:%d\n", pChara->lv);
    printf("HP:%d\n", pChara->hp);
    printf("MP:%d\n", pChara->mp);
}

int main(int argc, const char * argv[])
{
    
    // insert code here...
    
    // 戦士「ああああ」
    struct person aaaa;
    strcpy(aaaa.name, "ああああ");
    strcpy(aaaa.job, "戦士");
    aaaa.lv = 40;
    aaaa.hp = 360;
    aaaa.mp = 0;
    
    showStatus(aaaa);
    
    // 魔法使い「いいいい」
    struct person temp_iiii;
    struct person *iiii = &temp_iiii;        // ポインタ
    strcpy(iiii->name, "いいいい");
    strcpy(iiii->job, "魔法使い");
    iiii->lv = 38;
    iiii->hp = 250;
    iiii->mp = 230;
    
    showStatusPointer(iiii);
    
    return 0;
}

 前回のプログラムと同じ結果になることを確認して下さい。ポインタ型の方が良いか否かというのは、特にありません。個人の好みで使い分けていただければ構いません。

■スポンサーリンク

このページの先頭へ