2011-09-01 26 views
5

このコード:void *ポインタの参照問題?

int p = 10; 
void *q; 
*q = 10; 

がコンパイルされません:

'=': 'void *型' から 'int型から変換することはできません

ただし、このコードは罰金コンパイルされます。

int p = 10; 
void *q; 
q = &p; 

理由は何ですか?

+0

エラー。何のエラー? –

+0

'=': 'int'から 'void *'に変換することはできません – teacher

+0

あなたのコンパイラは異常です...変換したいと思うでしょうか?文 '* q = 10;'が与えられたとき 'int 'から' void * 'に変更されますか? ???そのステートメントでは、 '10'は' int'型で '* q'は' void'型です。 – pmg

答えて

5

void *ポイントに任意のメモリアドレスを割り当てることができるので、あなたが正常に動作し、ポインタのアドレスを指定された第2コードブロックに

、そのあなたはそうではありません)。

既知の型の変数にのみ、または既知の型のポインタを使用して割り当てることができます。

int p = 10; 
void *q = &p; 

*(int *)q = 20; 

if (p != 20) 
    ...something has gone horribly wrong... 

これは、int *void *を変換し、その間接参照整数ポインタに値を代入します。

4

いずれのポインタもvoid*に変換できますが、ポインタをvoidに逆参照することはできません。

+3

ええ、あなたは何も指さないものを書くことはできません。 – kenny

1

最初のスニペットは、の未定義の動作です。

0

無効なポインタを参照することはできません。そして、可能であれば、あなたのコードはランダムなメモリアドレスに書き込まれ、たぶんクラッシュするでしょう。それが初期化されている場合は、(未知のタイプのデータにvoid*

1

2つのコード(しようとする)が異なることをします。

最初の値は、オブジェクトに0を割り当てようとしていますqが指しています。ここには2つの問題があります。最初にポインタを初期化したことはありません。あなたはそれが指しているものの価値を変える前にどこかを指し示す必要があります。また、タイプがわからないため、void*を参照解除することはできません。

コードの2番目の部分は、変数pのアドレスをqに割り当てています。この後、qは、pに格納されているオブジェクトを指します。

1

これは、メモリq点のアドレスを変更します。これは(intlongstd::stringint**、など)に何q点の種類を把握することはできません

q = &p; 

。それは知っているすべては、メモリ内の位置です:

*q = 10; 

あなたが行うことができます:

int *iq = static_cast<int*>(q); 
*iq = 10; 

あなたはvoid*sについての詳細を読むことをお勧めします。

2

void *はどれくらい保持していて、何を保持しているのかわかりません。

なので、任意のサイズのポインタを入れることができるので、ポインタタイプを割り当てることができます。しかし、それは何を格納する必要があるか分からないので、値を割り当てることはできません...!

0

ポインタqは、任意のメモリ位置を指しません。あなたはそれに価値を割り当てることはできません。