アプリ版:「スタンプのみでお礼する」機能のリリースについて

しょーもない質問すみません。
C++を独学中のプログラミング自体初学者です。

今読んでる教科書に、malloc関数の説明として、
指定された大きさの領域をヒープに割り当て、その領域の先頭のポインタを返す関数であるとあり、
例には、

....
int *x;
x=(int *)malloc(sizeof(int));
*x=100;
.....

などとあるのですが、malloc関数の前の(int *)は
xはあくまで変数、malloc関数で帰ってくるのはpointerなので、
*でポインタから変数にした上で、その変数の型をintに強制的にしているという理解で合っているでしょうか??

どうも*がついている分、xはポインタのような気もして、混乱しています。

A 回答 (6件)

int *x ; で宣言された変数x は 「int *」型


mallocが返すのは 「void * 」型
です。
x=malloc(sizeof(int));
では
「int * 」型 = 「void *」型
なので、型が一致しません。
そこで、 (int *)を使って、 「void *」型を「int *」型に型変換しています。


わざと「ポインタ」という言葉を使わずに説明しました。
混乱の原因は、ポインタを特別なものだと思い過ぎているからではないでしょうか。


ちなみに。
・C++を使っているのなら、(型)というキャストは使わないようにするのがよいでしょう。
詳しくは「C++ キャスト」で検索すると解説サイトが見つかります

・C++では、領域割り当て用の演算子 new というものがあります。
これは、型を指定するので、キャストの必要はありません。
また、classやstructは、mallocで確保してしまうとコンストラクタが呼ばれません。
なお、mallocに対してfreeがあるように、new には deleteです。
    • good
    • 1
この回答へのお礼

一番わかりやすかったのでBAにさせていただきます。
ありがとうございます。後半についても勉強していきます。

お礼日時:2014/08/10 12:56

追加です。



言語の仕様としてはいろいろなコンピュータ、OSに対応する必要があります。
よって

>アドレスなのでintでもcharでも floatでも同じ長さではあるのですが、

と書きましたが、
intとcharとfloatで違うメモリーを使い、かつそのアドレスの長さが違う場合、

>代入の際には型を揃えることが重要なのです。

この文章が生きてきます。
int*にキャストしておくと問題なく解釈できます。
    • good
    • 0
この回答へのお礼

わかりました、代入の際には型を揃えること。おぼえておきます。

お礼日時:2014/08/10 12:54

しょーもない回答です。

静的な意味で考えた場合、mallocは
 void *malloc(size_t size);
で定義されている(voidのpointer)のでxに代入するとき、(int *)でキャストしないとエラーか何かになるからでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2014/08/10 12:52

>int *x;


xはint型へのポインタです。
*xはxが指し示す中身です。

>x=(int *)malloc(sizeof(int));
sizeof(int)はint型変数の大きさ(バイト数)を返します。
malloc関数はメモリを指定された大きさだけ確保する関数で、
返却値はそのアドレス(void *型)です。
そのアドレスは(void *)型ですが、xは(int *)型です。
ですから、(int *)を付けることでキャスト(型変換)をしてxに確保したint型のアドレスを渡しています。

>*x=100;
先ほどのmalloc関数で確保したアドレスに100を格納しています。
    • good
    • 0
この回答へのお礼

詳細な説明ありがとうございます!

お礼日時:2014/08/10 12:52

>xはポインタのような気もして



そのとおりです。

>x=(int *)malloc(sizeof(int));

int型1個分の領域を動的に確保して、
xがその場所を指すようにしています。

xはint型へのポインターですから、
*xはint型です。
    • good
    • 0
この回答へのお礼

ずばりありがとうございます。やはりxはポインタの認識で良いのですね。

お礼日時:2014/08/10 12:51

sizeof(int)の長さの記憶域を取ります。


そしてそのアドレスをxに入れます。
アドレスなのでintでもcharでも floatでも同じ長さではあるのですが、
xがint* の型なのでint*にして代入します。

代入の際には型を揃えることが重要なのです。
    • good
    • 0
この回答へのお礼

有難うございます。int*の型というところの理解ができていませんでした。

お礼日時:2014/08/10 12:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A