C言語 標準関数 | 応用 | サンプル

標準関数
構文
応用

管理人

プライバシーポリシー


ポインタのポインタ

C言語では、ポインタが壁であると良く言われます。その中で更に「ポインタのポインタ」って、さっぱり分からない。
説明しているサイトを見てもサンプルがないので良く分からない。

「ポインタのポインタ」って、理屈は分かるけど何に使うんだろうと言う疑問があると思います。

このページでは、その利用方法を簡単なサンプルをあげて説明します。

C言語で開発作業をしていれば、利用することもあるかと思います。

このサンプルでは、main関数が最後にありますが、こうすることによってプロトタイプ宣言が不要になり便利です。
最近はmain関数を最初に書くことが増えていますが、旧来main関数は最後に書いていました。

サンプルの解説

以下のサンプルを見てください。

mallocはポインタを返します。ローカル関数memory_allocでmallocを使用して、そのポインタを呼び出し元に返すサンプルを示します。

最初に考えることは、呼び出し元のmain関数で定義したポインタ変数(この変数にmallocしたアドレスが設定される)を、ローカル関数memory_allocに引数で渡すことです。

この引数は、mallocした結果を代入してもらうので、アンパサンド(&)をつけてアドレス渡し(サンプル内①)にしなければなりません。(アンパサンド(&)をつけないと参照渡しになってしまいます)

この引数を受けたローカル関数memory_allocでの引数定義は、ポインタ変数ptrをアドレス渡しにしているのでアスタリスクが2つになり、つまりこれが「ポインタのポインタ」になっています(サンプル内②)。

次にローカル関数内memory_allocでの該当引数への代入方法です。引数の型は「ポインタのポインタ」なので変数型は(char **)ですが、変数名はあくまでもpptrです。

この時、代入時の左辺はポインタの中身に設定するので、変数名pptrの先頭にアスタリスク(*)を一つ付ければ良いことになります(サンプル内③)。

サンプル

#include <string.h>

int memory_alloc( char ** pptr/* ② */ , char * contents ) {

  *pptr/* ③ */ = malloc( strlen( contents ) + 1 );
  if( *pptr == NULL ) {
    return -1;
  }

  memset( *pptr , '\0' , strlen( contents ) + 1 );/* クリア */
  strcpy( *pptr , contents );/* データ転送 */

  return 0;
}

main() {

  char * ptr;
  int ret;

  ret = memory_alloc( &ptr/* ① */ , "テストデータ" );
  if( ret == -1 ) {
    printf( "メモリ確保エラー\n" );
    return -1;
  }

  printf( "ptr=%s\n" , ptr );

  free( ptr );/* メモリ開放 */
}

実行結果

ptr=テストデータ

追記

このページではmallocが返したポインタを関数の引数で取得する方法を説明しましたが、ポインタを返すような関数であれば同様な方法で実行可能です。


Copyright © 2008-2015 http://hitorilife.com All Rights Reserved.