このコード:void *ポインタの参照問題?
int p = 10;
void *q;
*q = 10;
がコンパイルされません:
'=': 'void *型' から 'int型から変換することはできません
ただし、このコードは罰金コンパイルされます。
int p = 10;
void *q;
q = &p;
理由は何ですか?
このコード:void *ポインタの参照問題?
int p = 10;
void *q;
*q = 10;
がコンパイルされません:
'=': 'void *型' から 'int型から変換することはできません
ただし、このコードは罰金コンパイルされます。
int p = 10;
void *q;
q = &p;
理由は何ですか?
void *
ポイントに任意のメモリアドレスを割り当てることができるので、あなたが正常に動作し、ポインタのアドレスを指定された第2コードブロックに
既知の型の変数にのみ、または既知の型のポインタを使用して割り当てることができます。
int p = 10;
void *q = &p;
*(int *)q = 20;
if (p != 20)
...something has gone horribly wrong...
これは、int *
にvoid *
を変換し、その間接参照整数ポインタに値を代入します。
最初のスニペットは、の未定義の動作です。
無効なポインタを参照することはできません。そして、可能であれば、あなたのコードはランダムなメモリアドレスに書き込まれ、たぶんクラッシュするでしょう。それが初期化されている場合は、(未知のタイプのデータにvoid*
2つのコード(しようとする)が異なることをします。
最初の値は、オブジェクトに0を割り当てようとしていますq
が指しています。ここには2つの問題があります。最初にポインタを初期化したことはありません。あなたはそれが指しているものの価値を変える前にどこかを指し示す必要があります。また、タイプがわからないため、void*
を参照解除することはできません。
コードの2番目の部分は、変数p
のアドレスをq
に割り当てています。この後、q
は、p
に格納されているオブジェクトを指します。
これは、メモリq
点のアドレスを変更します。これは(int
、long
、std::string
、int**
、など)に何q
点の種類を把握することはできません
q = &p;
。それは知っているすべては、メモリ内の位置です:
*q = 10;
あなたが行うことができます:
int *iq = static_cast<int*>(q);
*iq = 10;
あなたはvoid*
sについての詳細を読むことをお勧めします。
void *はどれくらい保持していて、何を保持しているのかわかりません。
なので、任意のサイズのポインタを入れることができるので、ポインタタイプを割り当てることができます。しかし、それは何を格納する必要があるか分からないので、値を割り当てることはできません...!
ポインタq
は、任意のメモリ位置を指しません。あなたはそれに価値を割り当てることはできません。
エラー。何のエラー? –
'=': 'int'から 'void *'に変換することはできません – teacher
あなたのコンパイラは異常です...変換したいと思うでしょうか?文 '* q = 10;'が与えられたとき 'int 'から' void * 'に変更されますか? ???そのステートメントでは、 '10'は' int'型で '* q'は' void'型です。 – pmg