- 1 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:15:31 ]
- C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 117代目 pc11.2ch.net/test/read.cgi/tech/1225320579/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 37 pc11.2ch.net/test/read.cgi/tech/1224000127/ 過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
- 488 名前:476 [2008/11/07(金) 20:09:51 ]
- >>485-487
丁寧な説明ありがとうございます。 おかげでポインタの理解が深まりました。 人の質問に答えて見るもんですね。 同様に構造体の配列も要素数書いてもポインタになるのを始めて知りました。 試してみたらアドレス一緒でビックリ! でも、なんでdata[0]->data1じゃなくてdata[0].data1なんでしょうか? typedef struct{ int data1; int data2; }TEST_TABLE; void test(TEST_TABLE data[2]) { printf("%d\n", data[0].data1); printf("%d\n", data[0].data2); printf("%d\n", data[1].data1); printf("%d\n", data[1].data2); } int main(int argc, char *argv[]) { TEST_TABLE data[2] = {0,1,2,3}; test(data); return(0); }
- 489 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:23:24 ]
- まったく理解できてねぇwwwwwww
- 490 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:40:40 ]
- >>429
これでいいじゃない。 struct tm *v_localtime(time_t t) { return localtime(&t); } strftime(buf, sizeof buf, "%Y%m%d", v_localtime(time(0));
- 491 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:41:33 ]
- >>488
dataがポインタだから data[0]は構造体自体
- 492 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:42:27 ]
- >>488
[]演算子に*の意味が入っているから。
- 493 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:03:43 ]
- 1 TEST_TABLE data[10]; TEST_TABLEを要素とする配列。
2 data[0] 先頭要素。 3 &data[0] 先頭要素のポインタ。 4 data だけ書いたら↑3と同じ。 5 TEST_TABLE *p = &data[0]; 配列先頭要素へのポインタで変数 p を初期化。 6 TEST_TABLE *p = data; ↑5 と同じ。 7 p->data1 ポインタを使って要素へアクセス。 8 data->data1 ↑6,7 から、これは 7 と等価。 9 data と p は等価だから、data[0] は p[0] と等価。 10 つまり *p は p[0]。 11 (*p).data1 *演算子はポインタから実体を返す。だから要素アクセスはドット。 12 (*data).data1 上と同じ。 13 data[0].data1 ↑2で書いたように要素なのでアクセスはドット。 14 data[1] 二番目の要素。 15 &data[1] 二番目の要素のポインタ 16 以下 data[0] と同じ。 17 data[2] 三番目の要素。 18 以下↑と同じ。 19 p = dataのとき、 data[1] は *(p + 1) と同じ。 20 つまり、&data[1] は p + 1 21 data[1] は data[0] の後ろにくっついてるわけだから 22 &data[1] と &data[0] の間のアドレス距離は data[0] の大きさ分ある。 23 つまり、 p+1 と p では data[0] の大きさだけ移動してる。 24 等価等価言ってきたけど、 p++ はできて、data++ はできない。 25 以上とは関係なく、関数の仮引数では data[] は配列じゃなくポインタ。
- 494 名前:476 mailto:sage [2008/11/07(金) 21:11:52 ]
- >>491-493
またまた詳しい説明、ありがとうございました。 ポインタに関して理解していないところの多さを感じました。 まだまだ勉強不足ですね。 さて、名無しに戻って元々したかった質問をします。
- 495 名前:デフォルトの名無しさん [2008/11/07(金) 21:16:40 ]
- VC++でファイルからデータを読み込み分解するプログラムを作りたいです。
ファイルには hoge:aaa\r\n hage:bbb\r\n のように記述されていて、 hoge:に対する記述は hoge:aaa\r\n hoge:bbbb;012\r\n と";"の後にもデータが続いている場合があります。 aaaやbbbbの文字数は一定ではないです。 これを読み出すときに、 sscanf(bBuf,"hoge: %s",&data[HOGE][0]); としているのですが、";"以降がdataに入りません。 どうしたらいいでしょうか?
- 496 名前:デフォルトの名無しさん [2008/11/07(金) 21:33:13 ]
- >>493
> 3 &data[0] 先頭要素のポインタ。 > 4 data だけ書いたら↑3と同じ。 ダウト sizeof &data[0] != sizeof data
- 497 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:46:16 ]
- >>496
それは例外事項 data だけなら先頭要素のアドレスで正しい
- 498 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:49:47 ]
- ん?
- 499 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:52:25 ]
- 不毛だ
- 500 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:58:46 ]
- うるせーな
気にしてんだよ
- 501 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:18:19 ]
- data と p が等価で、 sizeof data が例外なのか。
p = data ができるのが例外なのか。
|

|