[767] Re:ポインタ完全制覇
投稿者:(ぱ)
2007/02/20 02:13:25
はじめまして。
>はじめまして、プログラミングを勉強するには遅すぎる年齢(28)で
>C言語を勉強している者です。それも再就職を目指し今は病気療養で傷病手当
お大事に。無理せずがんばってください。
>そこで、本の内容で、ポインタのポインタについて一切触れられてない点が気になり
>ました。(そんなに、使う物では無いのかな?と勝手に思ってもいますが)
ご意見ありがとうございます。
うーん、ポインタのポインタ(型)、というのは、単にポインタから派生したポインタ型に
過ぎませんから、宣言の読み方からすれば3章の記述で足りそうですし、
実際の使い方としては、4-2-2の「可変長配列の可変長配列」および4-2-4の
「引数経由でポインタを返してもらう」で扱っているつもりです。
また、実際にプログラムを書くときの用途もそんなところです。
もちろん、ポインタのポインタを引数で返してもらうときにはポインタのポインタのポインタを
使いますし、ポインタのポインタの可変長配列を作りたければやっぱりポインタのポインタの
ポインタを… いやこっちはさすがに構造体を導入すると思いますが。
まあ、「ポインタのポインタって何だ?」と疑問を持った人が、ポインタ完全制覇で
その説明を探すときのことを考えれば、章タイトルに「ポインタのポインタ」が
入っていたほうがよかったかもしれません。
>例えば
>int (*func)();
>int func2(int*);
>とプロトタイプ宣言し、mainブロック内で
>func = func2;
>とした時僕としては、プロトタイプ宣言時に
>int (*func)(void*);
なぜ、
int (*func)(int*);
ではだめなのでしょうか。
ひょっとして、funcに代入される実際の関数は、
int func2(int*);
int func3(char*);
int func4(double*);
のうちのどれだかわからない、ということでしょうか。
もしそうであれば、これはちょっと邪悪な書き方だと思います。
# 厳密に言うと規格上もまずいです。int*とvoid*が同じ形式とは限らないので。
どうしてもこういうことをしたければ、私なら、
int (*func)(void*);
としておいて、関数側で、受け取った後でキャストします。
int func2(void *a)
{
int *int_p = (int*)a;
...
}