• ベストアンサー

ポインタのポインタについて

 Cの初心者です、宜しくお願いします。  **(ポインタのポインタ)って言うのがあるみたいですが、どのような場合に使うのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.5

No.1です。 もっと簡単な使い方をご紹介した方が良かったですね。 void sub_func (FILE ** fp) { *fp = fopen ("A.TXT", "r") ; } void main_func (void) { FILE *fp ; sub_func (&fp) ; fclose (fp) ; }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • ricardo_
  • ベストアンサー率19% (14/72)
回答No.8

 例題を作ってみました。参考にして下さい。 int main(void) { const static char *const List[] = /* ポインタの配列 */ {"Apple\r\n" , "Banana\r\n" , "Chery\r\n" } ; char **pointer ; /* ポインタのポインタ */ /************************* * プログラムの始まり * *************************/ /*=== Put_str() の機能を説明 ===*/ Put_str("Put_str() は、文字列を印刷する関数です。\r\n") ; /*=== 配列を使う方法 ===*/ Put_str(List[0]) ; Put_str(List[1]) ; Put_str(List[2]) ; /*=== ポインタを使う方法 ===*/ pointer = List ; Put_str(*pointer++) ; Put_str(*pointer++) ; Put_str(*pointer++) ; } *** 結果 *** Put_str() は、文字列を印刷する関数です。 Apple Banana Chery Apple Banana Chery

htgotk_001
質問者

お礼

ricardo_さん、皆さん回答有り難うございました。 もう少し自分でも勉強してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.7

>二次元の配列は**をつけるということでしょうか。 一次元の配列は、a[m]のように書きますね。 同じように、二次元の配列は、b[m][n]のように書きます。 三次元の配列は、c[m][n][p]のように書きます。 以下、次元が増えていくごとに[]が増えていきます。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

>#5さん 質問者さんが混乱するといけませんので、念のために訂正しておきます。 【追加】 #include <stdio.h> 【訂正】 (誤) void main_func (void) (正) int main(void) >fclose (fp) ; の次の行に return 0; を追加

htgotk_001
質問者

お礼

二次元の配列は**をつけるということでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

>どのような場合に使うのでしょうか。 int main(int argc, char** argv); int main(int argc, char* argv[]); main の仮引数で argv (pointerのpointe) に使っているとか

全文を見る
すると、全ての回答が全文表示されます。
  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.3

No.1です。 Q:Cでは一般的には二次元の配列は、**AA[]というような書き方になるのでしょうか。 A:予め2次元配列の大きさが分かっている場合にはポインタなど使用せずに unsigned char a[3][4]; のように書けば横4画素、縦3画素の領域を確保できます。でも実行したときに判明する場合もありますよね ? 例えばデジカメの画像サイズは機種ごとに違うでしょうからどんな画像でも処理できるようにするには画像を格納するメモリ領域は実行時に対象の画像サイズに合わせて確保することがあるわけです。 そのような場合に、 insigned char **b: と定義して、malloc等でbにメモリを割り当てた後に、a[1][2]風の書き方、つまり (b[1])[2] のような書き方で画素にアクセスできるようになるわけです。 以下を参考にしてください。 縦3画素、横4画素分のメモリの割り当て方の一例 unsigned char **b; int i ; b=(unsigned char**)malloc(sizeof(unsigned char*)*3); for (i=0 ; i<3 ; i++) { b[i]=(unsigned char*)malloc(sizeof(unsigned char)*4); } 画像を読み込んで処理をする。 処理をし終わった。 for (i=0 ; i<3 ; i++) { free (b[i]); } free (b);

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

一次元の場合が a[m] という書き方ですので、二次元の場合は b[m][n] という書き方となります。 これで、三次元以上の場合の書き方も類推できますね。

全文を見る
すると、全ての回答が全文表示されます。
  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.1

一例を挙げます。 1色の8ビット画像データは縦横の2次元データと考えられます。 unsigned char a0 [4], a1 [4], a2 [4] ; unsigned char *a [3] = {a0, a1, a2} ; unsigned char **b = a ; とすると縦3行、横4列の画像を格納できます。そうすると、1行目、2列目の画素は(b [1])[2]で参照できます。ここでは3×4に固定してしまいましたが、実際には画像のサイズは色々なので汎用性を持たせるためには unsigned char **b ; だけを定義しておいて、実行時にmalloc等で2次元のメモリを確保したりします。

htgotk_001
質問者

お礼

 hashioogiさん、回答ありがとうございます。  >縦3行、横4列の画像を格納できます。  Cでは一般的には二次元の配列は、**AA[]というような書き方になるのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語のポインタとスタックポインタ

    プログラム始めて1ヶ月の初心者です。 C言語のポインタとスタックポインタというのは同じなのでしょうか。 スタックポインタの考えは大体理解出来たのですが C言語のポインタとなるとコードを見てもサッパリ分かりません。 ネットで調べても出てこなかったのでどなたか教えて下さい。 よろしくお願いします。

  • ポインタを使うことのメリットとは??

     こんばんは、Cの初心者です宜しくお願いします。  Cでポインタの記述を良く見るのですが、色々と本とかサイトとかで調べましたが、ポインタを使うことのメリットとか、使う理由を書いてるものに巡り合いません。  一体何故ポインタというものがあるのでしょうか。  変数(アドレス)を参照する事で、メモリの節約とか動作が速くなるとか、そのようなものが主な理由でしょうか。  逆にポインタを使わないと書けないプログラムとかはあるのでしょうか。  関数は、ポインタを引き数として元から設計されているので仕方がないとしても、、、、、、  以上初心者としての非常に素朴な疑問です、宜しくお願いします。

  • ポインタで詰まりました;

    こんばんわ、私は今仕事の合間をぬって独学でCとPerlを学んでいます。 まだやりはじめてから程無いのですが、ポインタに入ったところでつまづいてしまいました;(使い方がわからなくてパニックに; 以下の4つの問題、ポインタを使ったらどうやればいいのか教えてもらえないでしょうか? 1) 文字列の長さを求める関数を、ポインタを使って作成。 2) 文字列を比較する関数を、ポインタを使って作成。 一致の際(0)不一致の際は(1)を返す 3) 文字列中に含まれる、指定した文字の個数を求める関数を、ポインタを使って作成。 「what is this.」の場合、指定文字が「w」の場合は個数1を返す 4) 文字列中に含まれる単語の個数(スペースで区切られた部分)を求める関数を、ポインタを使って作成。 「ehat is this.」の場合、個数は3を返す。 私が今どのくらいの実力があるかといいますと、ほんと初心者同然です。 なので出来るだけ分かりやすく書いてくれると嬉しいです; よろしくお願いします(ノД`

  • 関数へのポインタ

    超初心者です。 C言語を使ってsin波を生成して音を鳴らそうとしているのですが・・ネットで調べてもよくワカリマセン・・ 超初心者な私でも理解できるようなサイトを教えて下さい. また、関数へのポインタも勉強しているのですが, char *(*func)(void); といったchar 型へのポインタを返す関数へのポインタというのがあったとして,関数へのポインタは理解できたのですがさらにchar 型へのポインタとなると一体これが何を指しているのかさっぱりで・・・・ ご協力お願いします.

  • ポインタ

    C言語で、 int c[6]と配列を作って、 ポインタでc[100]を指定すると、COREがでますよね? これをやると、コンピュータがフリーズする場合があるのですがなぜですか?

  • アドレスとポインタがどうしても理解できない

    C言語を独学しているのですが、どの参考書読んでも、アドレスとポインタの理解ができません。アドレスとポインタを使わなくても別に開発できるのではないかと思います。どなたか、アドレスとポインタを初心者でも分かるように分かりやすく教えて頂けないでしょうか?

  • ポインタ

    C言語初心者の者です。 構造体のいくつかのメンバを取り出して 複数の構造体にそのメンバの値をコピーする方法 をポインタのアドレス操作を使ってやりたいのですが さっぱりわかりません。手順を教えていただきたいです。 よろしくお願いいたします。

  • C++のシングルトンオブジェクトに対するポインタについて

    C++のシングルトンオブジェクトに対するポインタについて 只今C++を勉強中(すいませんが初心者)です。 タイトルの通り、C++のシングルトンオブジェクトに対するポインタについて 調べているのですが、web、手持ちの書籍上(もちろん入門系です)では確認 できなかったので、ここで質問をさせていただいております。 シングルトンオブジェクトのアドレスを保持しているポインタを、マルチスレッド 環境で利用する場合ってどの様な動きになるのでしょうか? 例えば同時アクセスされた瞬間、オブジェクト(ポインタ)は共有されるのか、 それともキューが発生してしまうのか、が知りたいです。

  • ポインタのポインタの必要性

    書物によるとポインタのポインタの使用例として「ポインタの配列」はポインタを使ってアクセスすることができます。」[*]とありますが、どうしてポインタのポインタが必要なのかがいまいちピンと来ません。 どういう場合なのかを知りたく思っています。 [*]サンプルスクリプト ===================================================== char *mnthp[3] = {/* ポインタの配列の宣言 */ "January", "February", "March" }; char **p1;/* 「ポインタのポインタ」の宣言 */ int i, j; p1=mnthp;/* 「ポインタのポインタ」にポインタの配列 */ /* の先頭番地を設定 */ /***** 例1 *****/ for (i = 0; i < 3; i++) {/* 「ポインタのポインタ」の値を変えずに */ printf("%s\n", *(p1 + i));/* 相対的に文字列を出力 */ } ==> このようなことをしなくとも printf("%s", mnthp[i]); で値を参照出来ると思われる。 ===================================================== [*] http://www9.plala.or.jp/sgwr-t/c/sec10-4.html 宜しくお願い致します。

  • ポインタ

    C言語のポインタみたいなことはできないかなと思い、 <? function a ($a){ print $a; $a="z"; } $c = "x"; a(&$c); print $c; ?> と興味本位でやってみたところ、 xz と表示されました。googleで "php ポインタ" と検索してもそれっぽい解説をみつけられなかったのですが、phpではC言語のポインタっぽい挙動をみせるこの機構をなんというのでしょうか・・・?(perlではリファレンスだった)

    • ベストアンサー
    • PHP