2017-07-25 17 views
-1

私はこれについては検索してみましたが運がありません。私は、ポインタについて読み、それらを使用して、私は非クラス型へのポインタが同じポインタ型とのみ互換性があることを知って、ポインタの互換性のある型に関するドキュメントはありますか?

int* apointer = anotherintpointer; 

ようですが、これは

(ない任意の明示的な変換なし)ことはできませんしています

私はこれを許さない点を見ていますが、完全ではありません。同様に、整数は、int x = afloatvariable;のように浮動小数点と互換性があるので、浮動小数点へのポインタと互換性のないintへのポインタはどうしてですか?

私の主な質問はです:私はこれらのポインタが同じポインタ型と互換性がある理由と、実際にこれが真であることを示す場所について読むことができる場所はありますか?経験。標準についてこれについて読むことができれば、私はそれをすばやくスキミングして見つけられなかったので、どこを読むべきかのヒントを教えてください。だから誰かが私にリンクや何かを提供することができれば、それは本当にすばらしいものではありません。

編集:コメントに基づいて、私は単語の私の使用互換は多分少しオフであることがわかります。私は互換によって意味することは、1つのタイプは、メモリ内の別の:)整数および浮動小数点数を持っている

+0

C++の低レベル型の基本的なプロパティについては、さらに詳しく調べる必要があります。 'float'型と' int'型は非常に異なっていますので、変換せずにそれらを交換することはできません。 – tadman

+0

フロートとintはメモリ内で同じように動作しません。したがって、あなたのintポインタが浮動小数点を指していて何かが整数のように使用しようとするならば。それはフロートを彩るでしょう。 – litelite

+0

整数が浮動小数点と互換性があります互換性はどういう意味ですか?彼らは_完全に異なるビット表現を持っているので、浮動小数点ビットをint型として解釈すると便利なものはありません。 – tkausl

答えて

1

integers are compatible with floating-points, so why should pointers to int not be compatible with pointers to float?

非常に異なる表現を割り当てることが許可されていることです。互換性がある唯一の理由は、コンパイラがいくつかの暗黙の変換「マジック」を提供することです。あなたは

float f = someInt; 

を書くとき、コンパイラはfloat表現にsomeInt値を変換するあなたのためのCPU命令を挿入します。

someIntintであり、ffloatであることがコンパイル時に分かっているため、コンパイラはこれを行うことができます。あなたはfloatへのポインタを持っている、と

float f = *pointerToFloat; 

を書くが、ポインタがintを指している場合pointerToFloatに関連した他のタイプが存在しないため、コンパイラは、ポインタがfloatを指していると思います。コンパイラは、ポインタがfloat表現を指していても、intfloatとして再解析することになり、完全に予期しない(および定義されていない)結果が得られると信じています。

If you can read about this in the standard, please give me a hint where to read

ポインタ変換に関連するthe standardの2つの部分があります - 一部3.7.4.3.2、とりわけ、安全に由来ポインタができることを説明し、明確に定義されたポインタ変換の結果は、 、およびプリミティブデータ型に関連する3種類のポインタ変換をリストした第4.10節を参照してください。

+0

ああ、その部分は私にはもっと意味をなさないが、 "主な質問"(あなたはすでにそれを少しでもまだ説明していることは分かっている)はどうだろう?ありがとう! –

+0

あなたは実際にあなたの答えを実際に更新したことを知りました。更新をありがとう、私は実際にその情報を使用することができます。しかし、ポインタが別の型のオブジェクトを指し示すことができないと言っている場所についてはどうでしょうか、その場所を見たり、どこを探すかを知っていますか?または、これはそれを定義する厳密なエイリアスルールですか?時間のためにありがとうございます:) –

+0

@FacPamポインタは間違った型のオブジェクトを指すことができます、それはもはやそれらはもはや明確に定義されていません。明確に定義されていないポインタからの読み取りは、未定義の動作です。 – dasblinkenlight

3

Like, integers are compatible with floating-points, so why should pointers to int not be compatible with pointers to float?

整数は浮動小数点数(またはその逆)へ転換ですが、あなたはRAMの値を構成する実際のビットを見れば、彼らは非常に異なっています。

10000000 00000000 00000000 00000000 

「等価」浮動小数点値1.0Fは、典型的にはこれらのビットで表現されている間:

00000000 00000000 10000000 00111111 

例えば

は、コンピュータは、おそらく、これらの32ビットの整数値1を表します。

浮動小数点値を指すように整数ポインタを設定した場合(またはその逆の場合)、ビットがひどく誤解され、期待した結果が得られないことがあります。ちょっとしたキャスティング・乱用に気をつけなければ、あなたはそれを試すことができます(このコードは未定義の動作を呼び起こし、教育的な目的のためだけであり、他の場所で一貫しているためこの動作に依存しないでください生産コード内のもの)の:1は単純に期待するかもしれないものは明らかにされていない...

y=0.000000 
x=1065353216 

:私のマシン上で

#include <stdio.h> 

int main(int, char **) 
{ 
    int x = 1; 
    float y = 1; 

    float * py = reinterpret_cast<float *>(&x); // evil! 
    printf("y=%f\n", *py); 

    int * px = reinterpret_cast<int *>(&y); // evil! 
    printf("x=%i\n", *px); 

    return 0; 
} 

、上記のコードは、これを出力します。このような実行時の動作を避けるために、コンパイラはポインタタイプをクロスコンバートしないようにします(reinterpret_castを使用して絶対に要求しない限り)。

+0

ああありがとう。しかし、標準で定義されているルールのようなものがあるのですか?それとも純粋な論理ですか(非クラス型へのポインタは同じポインタ型を指すだけです)? –

+1

あなたが探しているルールはこれかもしれないと思います。https://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule –

+0

もう一度お返事ありがとうございます。確かにまだ...しかし、私はそれについて読んでいるとchar *は任意の型を指すことができますが、私は 'char * acharp =&aninteger;'のような何かをするたびにエラーが発生します: "int型のvlaue" "" char * ""型のエンティティを初期化するために使用することはできません。私が間違ったことを言うことができますか?それとも新しい質問を始めるようにアドバイスしますか? –

関連する問題