おすすめポインタ攻略法

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

おすすめポインタ攻略法

投稿記事 by beatle » 13年前

おすすめポインタ攻略法です.
「学習法」じゃなくて「攻略法」というのがミソです.ポインタを深く理解するよりも,とりあえずエラーなく使えるようにすることが目標です.ポインタを既に理解している人であっても,分かりやすくポインタ関連のコードを書けるのでおすすめです.

みなさんは恐らく「char *」くらいならいいですけど「char **」となると嫌ですよね.「char *[]」なんてのもわかりづらいですよね.

CODE:

char **var1;
char *var2[4];
char (*var3)[4];
みなさんは上の3つの違い分かりますか?

なぜ分かりにくいのか.それは,2段階のポインタとか,ポインタの配列とか,配列へのポインタとか,普段見慣れないものが出てくるからです.

そこで,僕おすすめの「typedef法」の登場です.
分かりにくい型はtypedefで分解していくことで,格段に分かりやすくなります.

CODE:

typedef char * char_ptr; // char_ptrは「charへのポインタ」を表す型
typedef char char_array4[4]; // char_array4は「charの要素4の配列」を表す型

char_ptr *var1;
char_ptr var2[4];
char_array4 *var3;
これ,実は最初に示したvar1, var2, var3の宣言と同じ意味です.
var1はchar_ptrへのポインタ
var2はchar_ptrの配列
var3はchar_array4へのポインタ

こんな風に,普段使い慣れている1段階のポインタとか,1次元配列の形になれば分かりやすいですよね.

taketoshi
記事: 222
登録日時: 15年前

Re: おすすめポインタ攻略法

投稿記事 by taketoshi » 13年前

うわ、凄く解りやすい。目から鱗です。

上は瞬時に判断できなかったですが、下は読むだけで頭の中で意味が理解できました。

知識頂きます

アバター
へろりくしょん
記事: 92
登録日時: 15年前

Re: おすすめポインタ攻略法

投稿記事 by へろりくしょん » 13年前

そういえば、こういう定石ってなぜか入門書にはあまり書かれていませんね。

Cの宣言が変態なのは今に始まった事ではありませんが、もう少しどうにかならなかったのかといつも思います。
特に関数ポインタが絡んで来ると、もう目も当てられません。

void (*(*hoge)[10])(void);

とかぐらいまでなら、すんなり読めるでしょうが、

int (*(*hoge[10])(void))[10];

とか書かれると、もう無言で蹴り入れるレベルです。



それはそうと、INT_PTR LONG_PTR DWORD_PTR のビット幅は、いずれもポインタ長ですが、
どう使い分ければいいのか、さっっっっっっぱりわかりません。 えぇ、わかりません。

どれかに統一して欲しいですね。

ISLe
記事: 2650
登録日時: 15年前

Re: おすすめポインタ攻略法

投稿記事 by ISLe » 13年前

へろりあ さんが書きました:それはそうと、INT_PTR LONG_PTR DWORD_PTR のビット幅は、いずれもポインタ長ですが、
どう使い分ければいいのか、さっっっっっっぱりわかりません。 えぇ、わかりません。
マジレスすると、基本的にはINT,LONG,DWORDの値なのだけど、場合によってはポインタ値を入れるという変態的なAPIがあったりします。
x86環境ではINT,LONG,DWORDはポインタと同じビット長なので、キャストすれば済みました。
ところがx64環境ではポインタが64ビットなので長さが合いません。
苦肉の策として、基本的にはINTだけどポインタが入ることがあるパラメータはINT_PTR、…と置き換えてx64環境とコードを共通にするためのつじつま合わせをしたわけです。

使い分けはWin32 APIのプロトタイプに合わせるだけで良いのではないでしょうかね。
WinMainの前が巷ではWINAPIだったりCALLBACKだったりといいかげんなようにあまり気にする必要はないかもしれません。
最後に編集したユーザー ISLe on 2012年1月10日(火) 23:42 [ 編集 1 回目 ]