6

この記述は正しいですか?ポインターの「TYPE」は、他のタイプを指すことができますか? 私はそう信じているので、まだ疑いがあります。

ポインターが明確な型に対して宣言されるのはなぜですか? 例えばint、またはchar

私が得ることができた1つの説明は、int型ポインターが配列を指していたchar場合、ポインターがインクリメントされると、ポインターは0位置から2位置にジャンプし、その間の1位置をスキップします(intサイズ= 2のため)。

おそらく、ポインターは値自体ではなく、値のアドレスを保持するだけだからintですdouble

私が間違っている?その発言は正しかったですか?

4

5 に答える 5

8

ポインター交換可能ですが、必須ではありません。

特に、一部のプラットフォームでは、特定の型を特定のバイト境界に揃える必要があります。したがって、acharはメモリ内のどこにでもあるint可能性がありますが、4 バイト境界上にある必要がある場合があります。

もう 1 つの重要な潜在的な違いは、関数ポインターに関するものです。
関数へのポインターは、多くのプラットフォームでデータ型へのポインターと交換できない場合があります。

繰り返しますが、これはプラットフォーム固有です。

Intel x86 アーキテクチャはすべてのポインターを同じように扱うと思います。
しかし、これが当てはまらない他のプラットフォームに遭遇する可能性があります。

于 2013-10-31T15:34:58.757 に答える
5

すべてのポインターは特定の型です。void*任意のオブジェクト型を指すことができる特別なジェネリック ポインター型がありますvoid*が、逆参照する前に特定のポインター型に変換する必要があります。(関数ポインタ型は無視しています。)

ポインター値をあるポインター型から別の型に変換できます。ほとんどの場合、ポインタを からfoo*に変換し、元の値bar*に戻すとfoo*、元の値が得られますが、実際にはすべての場合で保証されているわけではありません。

type のポインターが typeのオブジェクトを指すようにすることはできますが、(a) 通常は悪い考えであり、(b) 場合によっては機能しない可能性があります (たとえば、ターゲットの型とのサイズまたは配置が異なる場合)。要件)。foo*barfoobar

次のようなことで逃げることができます:

int n = 42;
char *p = (char*)&n;

--pを指すようになりますが、 の値は得られません。の最初のバイトの値が として得られます。n*pnnchar

ポインター演算の異なる動作は、異なるポインター型を持つ理由の一部にすぎません。主にタイプセーフに関するものです。type のポインターがある場合int*、(安全でないことをしていない限り) それが実際にintオブジェクトを指していることを合理的に確信できます。そして、それを別の型のオブジェクトとして扱おうとすると、コンパイラはそれについて文句を言うでしょう。

基本的に、他の異なる型があるのと同じ理由で、異なるポインター型があります。そのため、コンパイラーの助けを借りて、各オブジェクトに格納されている値の種類を追跡できます。

(型指定されていないジェネリック ポインターしか持たない言語がありました。そのような言語では、ある型の値を格納し、別の型であるかのように誤ってアクセスするなど、型エラーを回避することがより困難になります。)

于 2013-10-31T15:35:10.570 に答える
1

ポインターの「TYPE」は、他のタイプを指すことができますか?

一般的にいいえ。タイプは関連している必要があります。

reinterpret_castを使用してポインタをある型から別の型にキャストすることは可能ですが、これらのポインタが a を使用して合法的に変換できない場合static_castreinterpret_castは無効です。したがって、 とが実際に関連していFoo* foo = ...; Bar* bar = (Bar*)foo;ない限り、実行できません。FooBar

reinterpret_castまた、オブジェクト ポインタから a へ、void*またはその逆にキャストするために使用することもできます。その意味で、avoid*は何でも指すことができますが、それはあなたが求めているようには見えません。

さらにreinterpret_cast、オブジェクトポインタから整数値へ、またはその逆も可能ですが、繰り返しますが、あなたが求めているようには見えません。

最後に、 には特別な例外が設けられていchar*ます。char*他の型のアドレスで変数を初期化し、結果のポインターでポインター演算を実行できます。指しているものが実際には ではない場合、ポインターを介して逆参照することはできませんがchar、実際の型にキャストしてそのように使用することができます。

reinterpret_castまた、どのような状況でも使用するたびに、崖の絶壁で踊っていることを覚えておいてください. Foo実際に指しているものが a である場合にa へのポインターを逆参照するとBar、型が関連していない場合に未定義の動作が発生します。このようなタイプのキャストは、何としても避けるべきです。

于 2013-10-31T15:38:35.860 に答える