- ベストアンサー
ポインタのポインタについて
Cの初心者です、宜しくお願いします。 **(ポインタのポインタ)って言うのがあるみたいですが、どのような場合に使うのでしょうか。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
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)
例題を作ってみました。参考にして下さい。 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
- asuncion
- ベストアンサー率33% (2127/6289)
>二次元の配列は**をつけるということでしょうか。 一次元の配列は、a[m]のように書きますね。 同じように、二次元の配列は、b[m][n]のように書きます。 三次元の配列は、c[m][n][p]のように書きます。 以下、次元が増えていくごとに[]が増えていきます。
- asuncion
- ベストアンサー率33% (2127/6289)
>#5さん 質問者さんが混乱するといけませんので、念のために訂正しておきます。 【追加】 #include <stdio.h> 【訂正】 (誤) void main_func (void) (正) int main(void) >fclose (fp) ; の次の行に return 0; を追加
お礼
二次元の配列は**をつけるということでしょうか。
- shippo_ppk
- ベストアンサー率51% (28/54)
>どのような場合に使うのでしょうか。 int main(int argc, char** argv); int main(int argc, char* argv[]); main の仮引数で argv (pointerのpointe) に使っているとか
- hashioogi
- ベストアンサー率25% (102/404)
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% (2127/6289)
一次元の場合が a[m] という書き方ですので、二次元の場合は b[m][n] という書き方となります。 これで、三次元以上の場合の書き方も類推できますね。
- hashioogi
- ベストアンサー率25% (102/404)
一例を挙げます。 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次元のメモリを確保したりします。
お礼
hashioogiさん、回答ありがとうございます。 >縦3行、横4列の画像を格納できます。 Cでは一般的には二次元の配列は、**AA[]というような書き方になるのでしょうか。
お礼
ricardo_さん、皆さん回答有り難うございました。 もう少し自分でも勉強してみます。