0

C ポインタの逆参照については疑問があります。次のコードがあるとします。

void *vptr; // declare as a void pointer type
int val = 1;
int *iptr;

// void type can hold any pointer type or reference
iptr = &val;
vptr = iptr;
printf("iptr=%p, vptr=%p\n", (void *)iptr, (void *)vptr);

を実行する(void *)iptrと、実際に何を印刷するのでしょうか? 逆参照すると数字の1が出力されるはずだと思っていたのですが、実際には住所が出力されます。何故ですか?(void *)また、住所を印刷するために前に追加する必要があるのはなぜですか? iptr十分ではないでしょうか?

ありがとう

4

3 に答える 3

2

(void *)iptr を実行すると、実際に何を出力するのでしょうか?

iptr実装定義の方法でポインターの値を出力しています。

逆参照すると数字の1が出力されるはずだと思っていたのですが、実際には住所が出力されます

操作で何も逆参照していません。(void *)にキャストしてい void *ます。が指すオブジェクトの値を出力するには、変換指定子を引数とともにiptr使用する必要があります(ここではポインターを逆参照しています)。d*iptriptr

また、住所を印刷するために (void *) を先頭に追加する必要があるのはなぜですか?

p変換指定子には type の引数が必要なためvoid *です。

iptr で十分ではないでしょうか?

iptrint *ただし、p変換指定子には が必要なためvoid *、キャストがないと、未定義の動作が呼び出されます。

于 2013-01-14T22:54:44.393 に答える
1

C/C++ でポインターを逆参照するには、*符号を使用します。実際に行っているのはiptr、void ポインターとしてキャストすることです。したがって、住所が印刷されていることがわかります。

代わりにこれを試してください: printf("iptr=%p, vptr=%p\n", *iptr, (void *)vptr); :)

于 2013-01-14T22:56:14.857 に答える
1

を記述するときは、 intへのポインターを void(void*)iptrへのポインターにキャストします。ポインターの逆参照は、 のように記述されます。これにより、値ポイントが取得されます。*iptriptr

iptrformatで出力%pすると、iptr が指すアドレスが出力されます。と同じ&valです。値ポイントを出力したい場合はiptr、フォーマットを使用してください%d

printf("*iptr=%d\n", *iptr);

これは表示されます

*iptr=1

于 2013-01-14T22:55:09.657 に答える