俺言語。

自分にしか理解できない言語で書かれた備忘録

【C,ポインタ】改めてCのポインタ 個人的まとめ

あっているかわからないけど,ポインタは結局は組み込みなどメモリ容量が制限される環境と,戻り値が2以上の関数でグローバル関数を使いたくない場合に有効な手段.
裏を返すと,メモリに余裕があって,動けば良くて,ポインタで躓いて時間を食うくらいなら,ポインタ関連を避けて通ったほうがいいのではと思う(現時点での理解).

とは言えもう一度整理.

混乱するポイントは,変数をポインタで宣言した後は*(アスタリスク)なしでアドレスを示す変数になる.という点.この図は大変分かりやすい.

も一つ混乱する原因となる,変数の配列の配列名だけの場合はその配列の先頭のアドレスを表す,という点.

uint8_t data[2] = {0, 1};

data = &data[0]; // <-これは同じ意味になる

これは実際良く使われていて,関数に配列を渡す場合,データが大きくなってしまうので配列の変数を渡すパターンで

uint8_t data[2] = {0, 1};
func(data);

func(uint8_t *recv_data){
    Serial.println(*recv_data) // 引数はポインタで宣言されているのでデータへのアクセスは*(アスタリスク)が必要.
}

みたいなケース.
注意点は関数の宣言側ではアドレスが来るのでポインタで引数を宣言しておくこと.

この辺りの例外的なルールがCのポインタ回りをわかりづらくしている要因のひとつかと.なんでこんなルールにしたのか理由があれば調べてみたい.

こちらを参考にさせていただきました.
www.sgnet.co.jp
www9.plala.or.jp
9cguide.appspot.com