![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
というのがC言語にありますよね?
このvoid型へのポインタというのは、
どのようにイメージすればいいのでしょうか?
例えばchar型へのポインタなら、
指している領域は
1バイトの領域ですよね?
ではvoid型は?
また
malloc関数を
使って
char *p;
p=(char *)malloc(1000);
とするとでchar型にキャストしているから、
1個1バイト分の領域が1000個用意して、
先頭アドレスをpに格納するのですよね?
では、
int *q;
q=(int *)malloc(1000);
としたら、用意されるのは、int型にキャストしているから
1個2バイト分の領域が500個用意されるのでしょうか?
お願いします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?5a7ff87)
No.1ベストアンサー
- 回答日時:
malloc(1000)とした場合、(int*)としようが(char*)としようが、常に1000バイトの領域が確保されます。
この1000は、確保するバイト数を示します。その結果、p=(char*)とした場合は、その領域を文字型のデータがあると(1000個ある)と見なしているだけです。
q=(int*)とした場合は、その領域にint型のデータがある(1000バイトに入るのは500個)と見なしているだけです。(今回はint型は2バイトとします。最近は4バイトが流行ですが・・・)
No.4
- 回答日時:
void型へのポインタは、どの型のポインタかを明示しないポインタですから
利用する時は適当な型にキャストする必要があります。
こちらの 「初級編 5.ポインタの型」のところをご覧ください。
http://maborosi.kobe-du.ac.jp/sugiura/soft/tora/ …
>1個2バイト分の領域が500個用意されるのでしょうか?
キャストに関係なく1000バイト分が確保されます。
#2で指摘されているようにint型は2バイトとは限りません。
むしろ32ビットOS上のC言語は4バイト(32ビット)が普通です。
参考URL:http://maborosi.kobe-du.ac.jp/sugiura/soft/tora/ …
ありがとうございます。
読んでみます。
<むしろ32ビットOS上のC言語は4バイト(32ビット)が普通です。
私が読んでいる本にはint型は16ビットとしてたので、、
最近は32ビットなんですね、
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?5a7ff87)
No.3
- 回答日時:
#1です。
void型のポインタは、単純にメモリのアドレスを示す為に使います。つまりvoid *pとしたとき、pが指すところに何の型かは不明だが、とにかくそこにデータがあるという場合です。では、このデータをどうやって操作するかというと、具体的な型を持ったポインタに代入してから使用します。char *a; a=p;のようにです。(この場合はそこに文字型のデータがある場合です。)もし、ここでint *b; b=p;とした場合は、int型のデータがそこにあると見なしたことになります。void型をつかうのは、とにかくアドレスを記憶したが、まだ何の型として使うかがその時点で、決まっていない場合が多いです。(char*型を使っているひとも多く見かけます。この辺は趣味の問題です)余談ですが、char *a;をa++とすると1バイト増加し、int *b; をb++とすると2バイト増加しますが、void *c;をc++するとこれは、コンパイルエラーになります。
No.2
- 回答日時:
char型のポインタの先が1バイトとは限りません。
例えばchar buf[10];
char *p;
void *q;
p = buf;
というコードの場合、pもqも10バイトの領域を指します。
mallocの引数は純粋にバイト数であって、何型にキャストするかはまったく無関係です。int型のサイズが何バイトかは処理系に依存するので、500個分intの領域がほしいならば
int *q;
q = (int *)malloc(sizeof(int) * 500);
if (q == NULL) /* mallocにしくじった時のエラー処理 */
と書くべきです。
ありがとうございます。
q = (int *)malloc(sizeof(int) * 500);
のように書いたのを思い出しました、
これで、int型の領域が500個
できるんですね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
C言語にて構造体のメンバがNULL...
-
2次元配列をポインタで参照した...
-
csvファイルをfscanfで読み込む...
-
char 文字列型 の表現範囲が-12...
-
strcpy関数で文字型変数へのポ...
-
char型にint型の数値を代入する。
-
new charとnew char[N]の違いは?
-
char AA[]{"全角文字"};から"全...
-
fstream型オブジェクトを関数の...
-
SubStringの使い方について
-
C言語を用いた環境変数の作成/...
-
C言語(C89)での文字列代入
-
文字列strの中から文字cを探す...
-
fgetc( )の戻り値はなぜ整数??
-
小数点入りの文字列をfloat型に...
-
C言語のmemcpy関数について質問...
-
C言語のプログラムについてです
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
-
szとlpszの違い
おすすめ情報