C言語

【C言語 構造体】構造体ポインタとは?構造体ポインタとアロー演算子についてわかりやすく解説!【初心者編】

c-language-structure-pointers-and-arrow-operators.png

<この記事について>

  • 「構造体ポインタがよくわからない」、「構造体ポインタって何なんだよ!」などと悩んでいる方に向けて書きました。
  • この記事を読むことで、構造体ポインタの仕組みや使い方について理解できます。
  • 結論としては、構造体ポインタは構造体変数のアドレスを格納することができるポインタ変数であり、各メンバにアクセス可能です。関数間の処理を速くしたり動的メモリの操作に使用されます。

こんにちは!こんばんは!

ちゃとらです(・ω・)/

今回は構造体ポインタとアロー演算子ですが、名前を聞いただけで難しそうなイメージがあります。

しかし、実際はそんなに身構える必要はないです。

構造体ポインタはほぼポインタ変数と同じで、アロー演算子は構造体ポインタから各メンバにアクセスするときに使用します。

ちゃとら

構造体ポインタとアロー演算子について解説します!

構造体ポインタとは

説明

構造体ポインタとは、構造体変数のアドレスを格納することができるポインタ変数のことです。

役割としてはポインタ変数と同じで、構造体の各メンバの値にアクセスすることができます。

とあるモブ

ポインタが絡むのかぁ~…

やっぱ、よく分かんねぇ…

ちゃとら

ポインタはややこしいからね、しょうがないね。

これだけの説明だと理解しづらいと思うので、サンプルコードを交えて具体的な説明をしていきます。

サンプルコード

実際に、構造体ポインタを使ったプログラムで仕組みを説明していきます。

#include <stdio.h>

typedef struct
{
	char name[30];
	int age;
	double heihgt;
	double weight;
}player;

int main(void)
{
	player p1 = {"James", 37, 205.7, 113.4};
	player *p = &p1;  /* 構造体ポインタpにp1のアドレスを代入 */

	printf("p1についての情報\n");
	printf("名前:%s 年齢:%d 身長:%.1fcm 体重:%.1fkg", (*p).name, (*p).age, (*p).heihgt, (*p).weight);

	return 0;
}
実行結果

p1についての情報
名前:James 年齢:37 身長:205.7cm 体重:113.4kg

14行目で構造体ポインタに構造体変数を代入しています。

構造体ポインタのデータ型は、扱いたい構造体タグ名と合わせなければ型の不一致で構造体変数アドレスを代入できなくなってしまいます。

17行目で構造体の各メンバの値を表示させています。

間接演算子「*」とドット演算子「.」では、ドット演算子の方が優先度が高いので、(*p).nameといった記述で各メンバの値を表示させています。

流れとしては、(*p)で構造体変数を参照し.nameでメンバの値にアクセスしています。

構造体ポインタのイメージ

このように、構造体ポインタを使って構造体の各メンバの値にアクセスできます。

しかし、間接演算子とドット演算子の2つの演算子を使ってアクセスするのは、ややこしくて少し面倒だとは思いませんか?

ちゃとら

この後紹介するアロー演算子は重要ですよ!

アロー演算子とは

アロー演算子とは、ポインタ変数から構造体や共用体などの要素(メンバ)にアクセスすることのできる演算子です。

アローという名前の通り「->」と弓のような記述で表します。

さっきのプログラムを基に、アロー演算子を使って構造体の各メンバを表示させてみました。

#include <stdio.h>

typedef struct
{
	char name[30];
	int age;
	double heihgt;
	double weight;
}player;

int main(void)
{
	player p1 = { "James", 37, 205.7, 113.4 };
	player *p = &p1;

	printf("p1についての情報\n");
	/* アロー演算子を使って構造体の各メンバにアクセス */
	printf("名前:%s 年齢:%d 身長:%.1fcm 体重:%.1fkg", p->name, p->age, p->heihgt, p->weight);

	return 0;
}
実行結果

p1についての情報
名前:James 年齢:37 身長:205.7cm 体重:113.4kg

このようにアロー演算子を使って構造体のメンバにアクセスすることができるので、ミスなくソースコードが作成できます。

構造体ポインタの使い道

とあるモブ

まぁ、構造体ポインタが便利そうなのはわかったけど、

具体的にどんなときに使うの?

ちゃとら

主に、関数間の処理を速くしたり動的メモリを操作するときに使われますよ!

構造体ポインタの使い道について、代表的なものを2つ紹介します!

関数間の処理を速くする

ある関数に構造体そのものを渡すよりも、構造体ポインタ(アドレス)を渡した方が処理を速くすることができます。

なぜなら、構造体という大きなデータの塊を渡すよりも構造体のアドレスという小さなデータを渡す方が、負荷をかけずにプログラムを動かすことが可能だからです。

制御システムなどの大きなプログラムやメモリの容量が少ない組み込み機器などのプログラムでは、重要になってきます。

動的メモリの操作

malloc関数などで構造体を動的に確保したいときには構造体ポインタを使わなければなりません。

理由としては、malloc関数などのやりとりでポインタを使用していることもありますが、動的メモリを扱う上ではポインタを使用しないと非常に操作がしにくいからです。

自作関数などで構造体を生成・破棄する際には、動的メモリを使うことで楽にプログラムを組むことができます。

まとめ

構造体ポインタとアロー演算子について

  1. 構造体ポインタは、構造体変数のアドレスを格納できるポインタ変数のこと。構造体の各メンバの値にアクセスできる。
  2. アロー演算子とは、ポインタ変数から構造体や共用体などのメンバにアクセス可能な演算子のこと。「->」と弓のような記述で表す。
  3. 構造体ポインタは主に、関数間の処理の高速化や動的メモリを操作に使用される。
ちゃとら

構造体ポインタとアロー演算子はセットで覚えておきましょう!

今回はここまでです。

ちゃとら(・ω・)/