7日目ポインタのポインタサンプルプログラム普通の変数にポインタ変数があるように、実はポインタ変数にも、ポインタがあります。以下のサンプルを実行してみてください。i++){printf("%s\n",*pps);pps++;//アドレスを一つずらす}}実行結果の例TaroHanakoTomTaroHanakoTom4行目を実行することにより、s[0]には"Taro"、s[1]には"Hanako"、s[2]には"Tom"という値が入った文字列の変数(二次元配列)が出来上がります。7から8行目で、それらを表示しています。5行目で定義されているのが、ポインタのポインタです。ポインタのポインタは、変数の型の跡に**をつけます。10行目で、ppsに、sを代入しています。変数sは、それぞれの文字列の先頭アドレスのポインタの配列となっていることから、これによりs[0]のアドレスを取得していることになります。型の定義の仕方こそ特殊ですが、関数ポインタも、ポインタ変数の一種です。そこに代入するのはあくまでも関数です。引数として利用する場合のサンプル続いて、関数の引数としてポインタのポインタを利用するケースを見て見ましょう。以下のサンプルを実行してみてください。0){free(*mem);}}実行結果HelloWorldcreateMemory、および、freeMemoryという関数で、引数としてポインタのポインタが利用されていています。このサンプルのように、メモリの生成や消去を関数内で行いたい場合は、ポインタではなく、ポインタのポインタを渡すことになります。この方法の利点は、ポインタの状態のチェックなどといったコードを関数内でできることから、ソースコードの中に同じようなコードを何度も記述する必要がないという点です。