C言語学習log:配列・ポインタの応用

やさしいC 第3版 』Lesson10は「配列・ポインタの応用」です。

ようやく10章を終えることができました。前章のポインタの理解が怪しかったので、今回はさらに怪しく時間もかかりました。ボリュームがあるので箇条書きでまとめていきます。

配列とポインタの関係

  • 配列名を記述するだけで、配列の先頭要素のアドレスをあらわすことができる。このことから、配列名は、配列の先頭要素のアドレスを格納しているポインタと同じはたらきをもつということが言える。
  • ポインタに間接参照演算子(*)をつけると、それが指し示している変数の値を知ることができたので、配列名に*をつけると、配列の先頭要素の値を知ることができる。
  • ポインタと配列が密接な関係を持つときに、ポインタの演算を行うことができ、配列名(ポインタ)に+演算子を使うと、足し算した数だけ先の要素を指し示すことができる。

引数と配列

  • 引数として配列を使うときは、実引数として配列名(配列の先頭要素のアドレス)を渡す。
  • 実引数として配列の先頭要素のアドレスを渡すとき、仮引数としてポイントを記述することができる。
  • 配列名を先頭要素へのポインタとして扱うことができたのとは逆に、ポインタに[ ]を使って配列のように表記することができる。ただし、[ ]を正しく使えるのは、ポインタと配列が密接な関係を持つときだけである。

文字列とポインタ

  • 配列を使って文字列を格納した場合は、" "を使って初期化したあと改めて文字列全体を配列に代入することはできないが、文字列を" "を使ってポインタで扱うように格納した場合は、さらに" "を使って扱う文字列を変更することができる。
  • 文字列配列の配列は「char 配列名[文字列の数][文字列の文字数] = {文字列1, 文字列2, 文字列3}」と表記し、文字列ポインタの配列は、「char *配列名[文字列の数] = {文字列1, 文字列2, 文字列3}」と表記する。

文字列の操作

  • 文字列を扱う標準ライブラリ関数には次のような関数があり、string.hというファイルをインクルードする。
    • strlen( )関数:文字列の長さを調べる
    • strcpy( )関数:文字列を配列にコピーする
    • strcat( )関数:文字列を連結する
    • strcmp( )関数:文字列を比較する
  • malloc( )関数は、プログラムを実行したときに必要なサイズのメモリを確保してその場所のアドレスを返し、確保したメモリは、free( )関数で開放する。この2つの関数は、stdlib.hをインクルードして使う。

関数ポインタ

  • 関数はアドレスを持ち、関数ポインタには関数のアドレスを格納する。
  • 関数ポインタの宣言は「戻り値の型 (*関数ポインタ) (引数リスト);」
  • 関数ポインタへのアドレスの代入は「関数ポインタ = 関数名;」
  • 関数ポインタに*を使うと、関数を間接的に扱う(関数を呼び出す)ことができる。
  • 関数ポインタによる関数の呼び出しは「(*関数ポインタ) (引数リスト);」