##ポインタはモードを切り替えて扱う
基本的にポインタは2つのモードが存在する。
- ポインタ変数モード
- 通常変数モード
この2つのモードを行き来して使う。
// 通常のint型の変数
int i = 0;
// int型のポインタを宣言
int *p;
// iのポインタをポインタ演算子によって出力し、pに代入
// このときは、ポインタ変数モード
p = &i;
// 通常編集モードに切り替えて、数値を代入
*p = 10;
##アドレス演算子&を勘違いしないで!
アドレス演算子&は変数のアドレスを求めるための計算記号なので、ポインタのモードを切り替えているわけではないです。
あくまでコンパイルするときに__アドレスとして置き換わる__だけであって、モード切り替えをしているわけではないです。
ここを勘違いしているといつまでもポインタが使えるようになりません。
##構造体の場合はひと手間かかる
構造体を使用する場合、__通常変数モード__への切り替えは下記のように書きます。
// (*構造体ポインタ変数名).要素名
(*student).year = 10;
手間なので、__通常変数モード__への切り替えを下記のように省略して書くこともできます。
// 構造体ポインタ変数名->要素名
student->year = 10;
#include <stdio.h>
#include <string.h>
typedef struct {
int year;
char name[64];
} student;
int main(void)
{
// student型の変数dataを宣言
student data;
// studentのポインタ型pdataを宣言
student *pdata;
// pdataにdataのポインタを格納
pdata = &data;
// pdataを通常変数モードに切り替え、値を格納
(*pdata).year = 10;
strcpy((*pdata).name,"MARIO");
// 同じことを別の書き方でやってみましょう
pdata->year = 20;
strcpy(pdata->name, "TANAKA");
return 0;
}
##まとめ
アドレス演算子とポインタのモード切り替えがごっちゃになって混乱しないようにしましょう。
また、構造体の場合は少し書き方が変わりますが、やっていることは同じ、__モード切り替え__です。焦る必要はありません。
###参考
ポインタ変数を使ってみる - 苦しんで覚えるC言語
https://9cguide.appspot.com/15-05.html