- PR -

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

投票結果総投票数:55
ポインタを徹底的に 47 85.45%
コンパイル周辺を理解しろ 3 5.45%
関数群を叩き込め 2 3.64%
初心者本もう一冊? 3 5.45%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
Kie
会議室デビュー日: 2004/03/30
投稿数: 3
投稿日時: 2004-08-12 03:58
私もあまりポインタは難しくなかったです。
要は、コンピュータのメモリ構造を考えれば良いだけなので。
はにまるさんの書かれたポインタのまとめ(面白い)で、はにまるさんは大体理解されていると思います。

難しくなるかもしれませんがコンピュータとして説明すると次のようになります。
メモリ上はバイト空間の集まりで、変数はその空間を適当な大きさに区切って使っている。データ(つまりは変数に格納されている情報)はメモリ上どこかにあり、それを指すために0から始まるアドレスを使っている。ポインタはそのアドレスを一時的にに格納して使う場所で、アドレス空間の大きさを保持できる変数(32ビットCPUなら4バイト)。
アドレスを指すので、そこには、char(1byte:8bit),short(2byte),long(4byte)どれでも指すことはできる。そのため、どの型のポインタにもエラーを出さずに使えるvoid *があります。
配列名は実はポインタで、逆にポインタに[]を付けて値を参照することも出来たりする。(少なくともMS系では。)

ポインタの難しいところは初心者は*の使い方が分からなくなることではないでしょうか。ポインタの定義に使ったり、中身を指すのに使ったり。逆に通常の型のアドレスを指す&の使い方。他には構造体のポインタで->で使ったりといったところも分かり難いけどコンパイルの構文エラーになるので分かります。
後はポインタに入れる内容をアドレスでなくて内容を入れてしまい、使えないメモリにアクセスしてしまうという障害に気を付ければ良いと思います。デバッグ時にポインタ変数の値の使い方を見直すと良いと思います。

ちなみに、
> ・定数はコンパイル時にリテラル情報に置換される。書込み不可の変数では無い。

通常、書込み不可ですよ。少なくともx86系、Windowsではメモリセグメントが違いますから。データでもコードでもない別のメモリ領域です。

> ・共有体なる物が存在する。
> ・VBのVariant型や型定義をしない言語の変数は、型+サイズ長+共有体の構造体では?

共有体は滅多に使いませんね。強引に、同じデータの場所を違う名前で使おうとするとき位でしょうか。
共有体は値を入れる場所ですが、VBのVariant型は実際はポインタと型情報です。VBではポインタの動作を見せないので処理系で常に中身を渡してくれます。場所は動的で特定されていないと思いました。

そこで本題ですが、はにまるさんは理解されているようですので、
私のお勧めはC++の初心者本に進むとか。あるいは似ているところで、JavaかC#か。

どうしても、Cにこだわりたいのであれば、独自のライブラリを作成して溜め込む。
ポインタを使った複雑なキャストにチャレンジするという手もありますが。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2004-08-12 09:09
引用:

>その次に構造体&クラスかな? 継承とか派生とかの概念が出てくるので

それは、C++の事ですか?


クラスはC++ですが、構造体はCでもありますよ。(^_^;
クラスって構造体の延長みたいな感じなので、構造体が理解できないと
たぶんクラスも???になると思います

たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-08-12 09:58
はにまるさんは「業務でCを使うことになった」と仰られて、その上で質問されているのだから、他の言語に誘導しようとするのは本題とはちがうような。

始めてCでプログラミングをした人を見ていると、ポインタに関してはすんなり理解できる人とそうでない人がいます。そんな中ではにまるさんはさっすが深い洞察力により十分に理解していらっしゃるように思います。

私の基準では、例えばある構造体の任意のメンバーのオフセットを取り出すようなマクロなんかを作れたりしたら、もうCに関してかなり熟練したなと判断しています。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-08-12 10:09
とりあえずいろいろなソースをみてみるのがよろしいと思います。
C言語アルゴリズム辞典という本があるのでそれを読んでみてはどうでしょうか?

>はにまる様
下のソースに間違いがあります。
どこが間違っていますでしょうか?

コード:
// 領域の確保
void AllocBuffer( char* pBuffer, int size )
{
	pBuffer = malloc( size );
}

// 領域の開放
void FreeBuffer( char* pBuffer )
{
	free( pBuffer );
}

// メイン
main()
{
	char* pBuffer;

	// 領域の確保
	AllocBuffuer( pBuffer, 20 );

	// 確保した領域に文字列をコピー
	strcpy( pBuffer, "TEST" );

	// コピーした文字列を表示
	printf( "[%s]\n", pBuffer );
	
	// 領域の開放
	FreeBuffer( pBuffer );
	
}





ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-08-12 10:15
とりあえず一点だけ。
引用:

Kieさんの書き込み (2004-08-12 03:58) より:
配列名は実はポインタで、逆にポインタに[]を付けて値を参照することも出来たりする


違います。配列はポインタではありません。
これについては、さきに挙げた C-faq に書かれています。
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-08-12 10:18
引用:

はにまるさんは「業務でCを使うことになった」と仰られて、その上で質問されているのだから、他の言語に誘導しようとするのは本題とはちがうような。



ちゃんと読もうね。今後、業務では使う機会は減っていくだろう、とおっしゃってます。
ですから、他言語に誘導するというのには非常に意味があると思います。
SE ということですから、新規案件においては、言語決定権を持つこともあるでしょう。
そのときに、自分が C と VB しか知らないので、その言語に決定せざるを得ないという
状況は損でしょう。

私は、業務系SE であれば C にこだわるのはやめるべきだと思いますね。
むしろ、C のことは忘れて、Java か C# に取り組むのが良いのではないかと思います。

お客さんからヒアリングした内容を、そのままプログラマーに伝達するだけの
SE が増えています。設計書と言ってもお客さんの言ったことを書き留めている程度だったり。
SE がプログラムを知らない、書けない、という状況になりつつあるわけです。

業務系 SE であれば、業務設計から クラス設計を行える程度の能力を身に付けて
欲しいと思います。 C を学ぶと言語の性質上、実装技術に偏りがちになるのでは
ないかと懸念します。

C を知ることで、コンピュータのことが分かる、他にも転用が利く基礎である、
ということが昔から言われていますが、実装屋(プログラマ) と 設計屋(SE) に
とって学ぶべきプログラミング言語は違うと思っています。

[ メッセージ編集済み 編集者: 未記入 編集日時 2004-08-12 10:22 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-08-12 10:24
引用:

Kieさんの書き込み (2004-08-12 03:58) より:

ちなみに、
> ・定数はコンパイル時にリテラル情報に置換される。書込み不可の変数では無い。

通常、書込み不可ですよ。少なくともx86系、Windowsではメモリセグメントが違いますから。データでもコードでもない別のメモリ領域です。




元の記述で正しいと思いますが・・・。
定数(#define)は書き込み不可な変数(const変数)じゃないですよね。
定数なので・・・。
で、コンパイル時にリテラル情報に置換されるから、シンボルが作成されない変わりにそれ自体が記憶領域を使用することはない。
const変数はシンボルが作成されるが記憶領域を使用する。

という認識でいますが・・・。

_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-08-12 10:26
こんにちわ。

引用:

ぽんすさんの書き込み (2004-08-12 10:15) より:
とりあえず一点だけ。
引用:

Kieさんの書き込み (2004-08-12 03:58) より:
配列名は実はポインタで、逆にポインタに[]を付けて値を参照することも出来たりする


違います。配列はポインタではありません。
これについては、さきに挙げた C-faq に書かれています。



配列名がポインタって言ってますから、配列名で先頭アドレスが取れることを言いたかったのでは?アドレス演算も出来るし、ポインタって言ってもいいかも?呼んだこと無いけど^^;
配列=ポインタはさすがにおかしいかと(汗

はにまるさん
>C言語にもIDEがあるんですね。
別にVCとか使ってC言語の開発が出来ないわけではありませんから^^;
C++の開発が出来るIDE→Cの開発が出来る

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