1

では、これら 2 つの関数は C++ で同じことを達成するのでしょうか?

void MYCLASS::clear() {
classSize = 0;
class_ptr = NULL;
}

void MYCLASS::clear() {
classSize = 0;
*class_ptr = NULL;
}

int *class_ptr私のヘッダーファイルで宣言されている場所。マウスを Visual Studio の上に置くと、class_ptr が同じ型として表示されます。

どちらもclass_ptrをNULLで指していると思います。ただし、実際に両方がこれを行っていることを確認したいと思います。

4

5 に答える 5

3

どちらもclass_ptrをNULLで指していると思います。

いいえ...

class_ptr = NULL;

ポインタの値をNULL、つまり に設定しますclass_ptr == NULL

*class_ptr = NULL;

を参照 (ポイント) するものclass_ptrNULLを に設定します。これは0です。 class_ptrそれ自体がその価値を保持します。

ポインタの値はアドレスです。そのアドレスにあるものは、ポインター自体の型の表現です (あるべきです)。つまり、

int *p = new int(10);
/* ... */
 p  <-- an address, let's say, 0x0000F8BE
*p  <-- an int, 10

int( NULLhas a value of 0) から参照する型への暗黙的な変換が存在しない場合class_ptr、コードはコンパイルさえされないことに注意してください (これにより、この特定のポインターの名前が不適切であると思われます)。


編集: @Mooing Duck の類推がとても気に入ったので盗みました (彼は回答を投稿していないので、気にしないと思います)。

家への道順を破壊することと、家を破壊することの違いのようなものです。

于 2012-09-10T23:15:08.657 に答える
2

いいえ、彼らは同じことをしていません。これ:

class_ptr = NULL;

ポインターを に効果的に設定しますNULL

一方、これは:

*class_ptr = NULL;

が指すアドレスの内容を に設定しclass_ptrますNULL。この場合、class_ptrは 型int*であり、NULLは整数値 として定義されているため0、ポインタの内容を に設定しています0

于 2012-09-10T23:14:49.633 に答える
1

いいえ、違います。最初のものはポインタを NULL に設定します。2番目のものは、WHAT IT IS POINTING ATをnullに設定します

于 2012-09-10T23:13:56.020 に答える
0

いいえ、これらの行は同じではありません。

class_ptr = NULL;ポインターを 0 に設定します。実際の整数 (ポインターが指す場所) は変更されません。ポインターを失っているだけです。

*class_ptr = 0;ポインターを逆参照し、実際の整数の値を 0 に設定します。ポインターを保持していて、その後も有効です。

于 2012-09-10T23:16:13.320 に答える
0

2 つのコードは明らかに異なるため、2 つの異なることを行います。最初の関数は、明確な関数に対して正しい可能性が最も高いようです。2 番目がポインターが 2 を指している値を設定していることを考えると、それを NULL に設定することはあいまいです。コンパイル中 (NULL = 0) は間違っているように見えますが、おそらくそうです。

私の推測では、最初のものはあなたが意図したものです。

于 2012-09-10T23:19:21.307 に答える