アプリ版:「スタンプのみでお礼する」機能のリリースについて

ポインタを理解するために以下のようなテストプログラムを作りました。
test.h
---
typedef struct i_info{
int i_id;
char i_name[64];
} I_INFO;
typedef struct j_info{
int j_id;
char j_name[64];
} J_INFO;
typedef struct k_info{
int k_id;
char k_name[64];
} K_INFO;
typedef struct info{
int id;
char name[64];
I_INFO iinfo;
J_INFO *jinfo;
K_INFO **kinfo;
} INFO;
---

test.c
---
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include "./test.h"
4
5 int main(int argc, char **argv)
6 {
7 INFO info;
8 J_INFO j;
9 K_INFO k;
10 K_INFO *pk=NULL;
11
12 memset (&info,NULL,sizeof(info));
13 memset (&j,NULL,sizeof(j));
14 memset (&k,NULL,sizeof(k));
15
16 info.id = 1;
17 memcpy(info.name,"***",3);
18
19 info.iinfo.i_id = 2;
20 memcpy(info.iinfo.i_name,"*i*",3);
21
22 info.jinfo = &j;
23 j.j_id = 3;
24 memcpy(j.j_name,"*j*",3);
25
26 info.kinfo = &pk;
27 pk= &k;
28 k.k_id = 4;
29 memcpy(k.k_name,"*k*",3);
30
31 printf( "%d\n",info.id);
32 printf( "%s\n",info.name);
33 printf( "%d\n",info.iinfo.i_id);
34 printf( "%s\n",info.iinfo.i_name);
35 printf( "%d\n",info.jinfo->j_id);
36 printf( "%s\n",info.jinfo->j_name);
37 /*
38 printf( "%d\n",info.kinfo->k_id);
39 printf( "%s\n",info.kinfo->k_name);
40 */
41 }
---
38,39行目をコメントアウトするとコンパイルは通るのですが、
そのままだとコンパイルエラーになります。
なぜいけないのでしょうか?理由を教えてください。

A 回答 (5件)

ポインタのポインタというのはどういうときに使うかと言いますと、多くの場合「ポインタ変数の配列」を扱いたいときに使用します。

(もちろんそうでない場合もあります)

yumi-mikaさんのプログラム例は、要素が一つしかないポインタ変数の配列と考えることができます。そのため、#3の回答を書きました。

ポインタのポインタを説明するには図がないときついのでここには書けませんが、yahooで「ポインタのポインタ」で検索すると解説ページがいっぱい出てきますので、そちらをご覧になってください。

ではC言語の習得頑張ってください。
    • good
    • 1
この回答へのお礼

yahooだとずいぶんと見つかるものですね。#文章なのに
度々ありがとうございました。今後ともよろしくお願いいたします。

お礼日時:2003/01/31 16:12

すいません、分かりにくかったらこうでもいいです。



printf( "%d\n",(*info.kinfo)->k_id);
printf( "%s\n",(*info.kinfo)->k_name);
    • good
    • 1
この回答へのお礼

希望どおりに動作することを確認しました。どうもありがとうございました!
ただどうも理由が理解できません。
ポインタまでならわかるのですが(本当はわかっていないのかもしれません)、
ポインタのポインタ(しかも構造体)となると急にわからなくなってしまいます。
また似たような壁にぶつかりそうな気がします。
よろしければ、どうやったら上のような文法になるのか理由を教えてください。
ここで説明するには長くなりすぎるということであれば、
ポインタについてShigureさんご自身が参考とした本や
URLなどございましたら教えていただけると助かります。
よろしくお願いいたします。

お礼日時:2003/01/31 15:34

正しくはこうですね。



printf( "%d\n",info.kinfo[0]->k_id);
printf( "%s\n",info.kinfo[0]->k_name);
    • good
    • 0

ごめんなさいミスりました



printf( "%d\n",**(info.kinfo)->k_id);
printf( "%s\n",**(info.kinfo)->k_name);
    • good
    • 1
この回答へのお礼

やはりだめのようです。
jinfoとkinfoの違いはポイント先が1回増えるだけですよね?
iinfoとjinfoはうまくいく表示できるのですが・・・。

お礼日時:2003/01/31 14:40

printf( "%d\n",*(info.kinfo)->k_id);


printf( "%s\n",*(info.kinfo)->k_name);

これでどうでしょう

メモリ上 info.kinfo->pk->k_id となっているからです

この回答への補足

お返事ありがとうございます。
早速ためしてみましたが、エラーメッセージはいままでと変わりません。

#質問時には800文字の制限にひっかかり、
エラーメッセージまで記載できなかったので今回記載します

gcc test.c
test.c: In function `main':
test.c:37: request for member `k_id' in something not a structure or union
test.c:38: request for member `k_name' in something not a structure or union

補足日時:2003/01/31 14:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!