- ベストアンサー
void型ポインタ
void型ポインタがわかりません。ためしに void a; printf("%d",sizeof(a)); でも当然エラーになりました。どうしてvoid型はないのにvoid型ポインタは存在するのでしょうか?サイズはどうなているのですか?また何に使うのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
void v; は、「何もない」vという変数を宣言しています。 このvはメモリには当然存在しませんし、「何も無い」のだから何かを入れることも、何かを取り出すこともできません。 だから、存在しません。 void *p; は型のないポインタ変数を宣言します。 ポインタ変数は存在します。このvoidは型が無いことを示しています。 ポインタ変数は変数のアドレスを格納するための変数です。 つまり、 int *pi;//int型変数のアドレスを格納する変数 char *pc;//char型変数のアドレスを格納する変数 short *ps;//short型変数のアドレスを格納する変数 となるわけです。 上記のそれぞれの変数のサイズは4byteです。 アドレスは常に4byteの領域を必要とするわけです。 その他にも、関数ポインタや構造体ポインタなどありますが 全てアドレスなので4byteです。 そう、ポインタ変数は型が何であれ格納されているのは、4byteのアドレスなのです。 そのアドレスがどのような変数を指し示しているのかを知るために型を持っています。 型の無いポインタ変数は、どんな型のアドレスでも、結局4byteのアドレスなのだから型に拠らないアドレスとして扱うためにあります。 だから、int型の変数のアドレスでもchar型の変数のアドレスでも何でも入れる事ができます。 とても懐が広いですね。 私もこんな懐の広い人と付き合いたいものですよ。 結局はアドレスを入れる箱だと云う理解でいいと思います。 使い方としては色々用途がありますが、 さまざまな型に対応したい。とか メモリのアドレス情報のみが欲しい。とか 例えば、 #include <stdio.h> int main(void) { void *v[10]; int i = 1234567890; v[0] = printf; v[1] = "test"; v[2] = &i; (*(int(*)(const char*, ...))v[0])("%s %d\n", (char *)v[1], *(int *)v[2]); return 0; } こんな使い方。 まぁ、これは冗談ですが、理解が進むうちに必要性に気づけるはずです。
その他の回答 (3)
- tatsu99
- ベストアンサー率52% (391/751)
voidとは本来「何もない」ことを示す言葉ですが、 void型ポインタは以下のように、 void *ptr1;と定義します。 通常、ポインターは必ず型を持ちます。 char *ptr2; int *ptr3; のようになります。 これは、ポインターが示すところのデータがchar型、int型であることを意味します。 しかしがら、ポインターの示す先が、char型かint型かはどうでもよくて、そのアドレスだけを問題にする場合があります。 そのような場合に、void型のポインターを使用します。 このポインターの示す先に、char型のデータがある場合は、 ptr2 = (char*)ptr1;とします。 そうすると*ptr2とすることにより、そのポインターが示すchar型のデータを操作可能になります。 同様にして、 ptr3 = (int*)ptr1;とすると、int型のデータを操作可能にすることができます。 従って、void型のポインターは、void型自体で使用するのでなく、他の型に変換してから使うことを前提としています。しかし、いまの時点では、どの型にするか決まっていない状態なので、単純にアドレスのみを示す情報を保持していることを示すvoid*という形で定義します。
お礼
回答ありがとうございます。単体ではアドレスを指し示すんですね。
- eroermine
- ベストアンサー率18% (83/444)
void func()と void *ptr の void はなんの関係もありません。 予約語を増やしたくないので void を使いまわしました。 * も 掛け算とポインタの指す場所の内容との二つの意味があるが関係は無い。
- bluecampus
- ベストアンサー率66% (138/209)
void* a; printf("%d", sizeof(a)); では?
お礼
回答ありがとうございます。たしかにそうでした。
お礼
回答ありがとうございます。