【独学C言語入門⑮】ポインタと構造体の関係について学ぼう【ポインタ基礎編③】

今回は《ポインタと構造体の関係について学ぼう》というテーマで記事をまとめます。

複数の変数の塊である「構造体」を「ポインタ」で参照する場合、少し特殊な記法となります。しっかり学んでいきましょう!

ポインタの基本を習得していない方は、まずは下記の記事を参考に学習をしてみてください。

尚、現在執筆中のC言語入門記事は以下の人を対象としています。

  • プログラミング未経験の人
  • C言語プログラミングの学習をこれから始めたい人
  • C言語プログラミングの学習を始めたばかりの人

ポインタと構造体の関係について学ぼう

ポインタと構造体の関係について学ぼう

ポインタと構造体

ポインタを利用して構造体メンバ変数への値の代入・取得方法を解説します。

<【独学C言語入門⑫】構造体について学ぼう>にて、構造体は「複数の変数を1つにまとめたもの」という解説をしたかと思います。そして、"."を用いることでメンバ変数への値の代入・取得を行うことができました。

ポインタを用いると、通常の変数とは異なる方法でメンバ変数を参照することができます。

構造体ポインタ変数の変数定義

まずは、構造体ポインタ変数の変数定義から解説します。

基本的には通常の変数と同じ方法で変数定義することができます。

struct 構造体名* ポインタ変数名;

構造体変数のアドレス取得

次は、構造体変数のアドレス取得方法から解説します。

こちらも通常の変数と同じ方法で取得することができます。

ポインタ変数名 = &構造体変数名;

ポインタを用いた構造体メンバ変数への値の代入・取得

構造体ポインタ変数の場合、メンバ変数の参照に2通りの方法があります。

  • アロー演算子("->")を使用する方法
  • 通常の変数と同様の方法(“*”を付与)

アロー演算子("->")を使用する方法

1つは、アロー演算子と呼ばれる”->”を使用する方法です。

/* 値の代入 */
構造体変数名->メンバ変数名 = 値;

/* 値の取得 */
他の変数名 = 構造体変数名->メンバ変数名;

2つの方法の内、一般的にはこちらの方法を使うことが一般的なのでしっかり習得しておいてください!

通常の変数と同様の方法(“*”を付与)

もう1つは、通常の変数と同じように構造体変数の前に * をつける方法です。

/* 値の代入 */
(*構造体変数名).メンバ変数名 = 値;

/* 値の取得 */
他の変数名 = (*構造体変数名).メンバ変数名;

この方法を使用する場合、”*”を付与した構造体変数名を丸括弧で囲む必要があることに注意してください。

サンプル

それでは、サンプルを用意したので実行してみてください。

#define _CRT_SECURE_NO_WARNINGS 

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

struct person_info {
    char name[10];
    int age;
};

void main() {
    struct person_info  person1;
    struct person_info* ptrPerson1;

    /* 構造体のメンバ変数に値を代入 */
    strcpy( person1.name, "tarou" );
    person1.age = 17;

    /* 構造体ポインタ変数にアドレスを代入 */
    ptrPerson1 = &person1;

    /* 表示 */
    printf( "person1.name = \"%s\"\n", person1.name );
    printf( "person1.age = %d\n", person1.age );
    printf( "ptrPerson1->name = \"%s\"\n", ptrPerson1->name );
    printf( "ptrPerson1->age = %d\n", ptrPerson1->age );
    printf( "\n" );

    /* ポインタを用いて構造体のメンバ変数を更新 */
    strcpy( person1.name, "tarou" );
    person1.age = 17;

    /* 再表示 */
    printf( "person1.name = \"%s\"\n", person1.name );
    printf( "person1.age = %d\n", person1.age );
    printf( "ptrPerson1->name = \"%s\"\n", ptrPerson1->name );
    printf( "ptrPerson1->age = %d\n", ptrPerson1->age );
}

次回も「ポインタ」が続きます

今回は「ポインタと構造体の関係」について学んでもらいました。

次回も引き続き「ポインタ」について解説したいと思います。ポインタの基礎編④として、ポインタのポインタ変数について解説します。ポインタのポインタ変数が習得できれば、ポインタの基礎は一通り習得できたといっても過言ではありません。

ご期待ください。

タイトルとURLをコピーしました