- PR -

C言語で初心者本を読んだ次の一手は?

投票結果総投票数:55
ポインタを徹底的に 47 85.45%
コンパイル周辺を理解しろ 3 5.45%
関数群を叩き込め 2 3.64%
初心者本もう一冊? 3 5.45%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-08-12 19:38
引用:

ukさんの書き込み (2004-08-12 19:22) より:
a[i]は*(a+i)のシンタックスシュガーである、というのを勘違いされているのではないですか。



あ、すいません。何か勘違いしていましたでしょうか?^^; 上記の例だと、「a」が要素の先頭アドレスを指すので *(a+i) が同義になるのは理解できてますが…うーん。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-08-12 19:50
引用:

水無月 遊々さんの書き込み (2004-08-12 19:38) より:
あ、すいません。何か勘違いしていましたでしょうか?^^; 上記の例だと、「a」が要素の先頭アドレスを指すので *(a+i) が同義になるのは理解できてますが…うーん。


同義、というかコンパイラはa[i]を*(a+i)として扱う、ということです。
なので、2["abcde"]なんて書くことも可能です。配列そのものがCにおいてはシンタックス
シュガーみたいなものなんですよね。
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-08-12 20:29
引用:

ukさんの書き込み (2004-08-12 19:50) より:
同義、というかコンパイラはa[i]を*(a+i)として扱う、ということです。
なので、2["abcde"]なんて書くことも可能です。配列そのものがCにおいてはシンタックス
シュガーみたいなものなんですよね。



う〜ん、「添え字演算子は演算の際に間接参照として展開するから」と書いたぐらいなんである程度は理解しているつもりなんですが…^^; 書き方が悪かったかもしれませんね。申し訳ありませんでした^^; ただ、uk様は配列…と言うよりは、添え字演算子の動作のお話をされているんじゃないかと思うんですよね。 2["abcde"] に関しても、"abcde"が要素の先頭アドレスを指し示すので今までの例と同じですよね?

どちらかというと、私が言いたいのはポインタは配列とは違って、行き先を指し示す実体のないラベルのようなもの…ってことが言いたいんですよね。だから、「配列=ポインタ」と言うのは抵抗があるというか…。うーん、伝わらないでしょうか? すいません、あんまりうまく伝えられなくて…。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-08-12 23:35
引用:

ukさんの書き込み (2004-08-12 19:22) より:
a[i]とi[a]が交換可能であるというのは有名ですね。


有名なのはやっぱり「見た目がヘン」だからですよね。
「国際難解Cコードコンテスト以外では役に立たない」と言われて
いますが、添字演算子がシンタックスシュガーであることを理解する
助けにはなる... のかな?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-08-13 13:57
引用:

水無月 遊々さんの書き込み (2004-08-12 20:29) より:
う〜ん、「添え字演算子は演算の際に間接参照として展開するから」と書いたぐらいなんである程度は理解しているつもりなんですが…^^; 書き方が悪かったかもしれませんね。申し訳ありませんでした^^; ただ、uk様は配列…と言うよりは、添え字演算子の動作のお話をされているんじゃないかと思うんですよね。 2["abcde"] に関しても、"abcde"が要素の先頭アドレスを指し示すので今までの例と同じですよね?


なるほど。どちらかというと「配列とポインタは似て非なるものである」というところに
引っかかったので、あのような表現になりました。Cではあくまでポインタありきで、
プログラミングを容易にするために配列がある、というのが私の考えです。

引用:

だから、「配列=ポインタ」と言うのは抵抗があるというか…。うーん、伝わらないでしょうか? すいません、あんまりうまく伝えられなくて…。


「配列=ポインタ」は間違いですね。「配列名は、配列の先頭要素を指すポインタ定数として
読み替えられる」ということですよね。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-08-16 19:05
引用:

がるがるさんの書き込み (2004-08-12 18:01) より:


え!そういう返答という事は、「ばってん」な訳ですね。
実は結構、自信があったのですが...流石はシロート
りばぁさんのご指摘どおり、理由(2)が的外れだったんですね...

って事で、実際にプログラミング実行しましたが、
上記の問題が解けません。うぇぇぇん。

対応点:
・ソースにinclude定義で stdio.h stdlib.h string.h を追加。
・AllocBuffuer( pBuffer, 20 ); の関数名をAllocBufferに訂正

動く...
多分、動きはするが危険性を含む構成かな?と思い見直しましたが、解らずです。

<追記>
ヌルポインタの言葉の意味を間違えて違っていました...失礼いたしまいた。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-08-16 19:47
引用:

はにまるさんの書き込み (2004-08-16 19:05) より:
って事で、実際にプログラミング実行しましたが、
上記の問題が解けません。うぇぇぇん。


動きましたか。じゃあ
char* pBuffer = NULL;
とやっとくとどうなりますか?

引用:

多分、動きはするが危険性を含む構成かな?と思い見直しましたが、解らずです。


動く可能性はあるけど、たいてい動かないと思います。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-08-16 23:00
引用:

ukさんの書き込み (2004-08-16 19:47) より:


ありがとうございます。問題が解けました...
がるがるさんのを直利用すると

×AllocBuffer( pBuffer, 20 );

○AllocBuffer( &pBuffer, 20 );

×pBuffer = malloc( size );

○*pBuffer = malloc( size );

ですね。(メモリ解放は省略)

引用:

char* pBuffer = NULL;



上記を追記すると[(Null)]と表示され、一瞬意味不明でしたが、
各箇所に下記を追記して納得です。

コード:


printf( "Value [%d]", pBuffer);
printf( "Address [%d]", &pBuffer);
printf( "ValRefVal[%d]", *pBuffer);



多分、 Windows98だから(メモリ保護が弱いから)すんなり動いたのかな?

#編集:%のフォーマット指定を勘違いしていた...


[ メッセージ編集済み 編集者: はにまる 編集日時 2004-08-17 00:05 ]

スキルアップ/キャリアアップ(JOB@IT)