2017-01-21 10 views
0
static int* p= (int*)(&foo); 

私は、pがコードセグメント内のメモリを指していることを知っています。 しかし、私はこの行で何が起こっているのか分かりません。
私は多分それは関数へのポインタだと思ったが、関数を指すように形式は次のとおりです。この行はC99で何を意味していますか?

returnType (*pointerName) (params,...); 
pointerName = &someFunc; // or pointerName=someFunc; 

答えて

1

あなたはfooのアドレスを取得し、intへのポインタにキャストします。

foopの型が異なる場合、コンパイラは型の不一致に関する警告を出すことがあります。キャストは、その警告を抑えることです。例えば

、コンパイラ(initialization from incompatible pointer type)から警告を引き起こす次のコード、検討:fooここ

float foo = 42; 
int *p = &foo; 

intp点ながら、floatあります。明らかに - 異なるタイプ。

typecastingは、1つの変数を別の型のものとして扱います。新しい型名を括弧で入れて型キャストします。ここでは、intへのポインタのように扱われることをfloatへのポインタを行いますと、警告はもうできなくなります。

float foo = 5; 
int *p = (int*)(&foo); 

あなたにも括弧のペアを1つ省略していたかもしれないと、それは同じことを意味したい:

float foo = 5; 
int *p = (int*)&foo; 

fooが機能の場合は同じです。代入の右側の関数へのポインタと、左側のintへのポインタがあります。 intのアドレスとして扱われる関数へのポインタを作るために、キャストが追加されます。

+0

関数の型は、返される変数の型を意味しますか? – TheLogicGuy

+0

機能はありません!私は自分の答えを広げたので、今はもっと明らかになっています。 – lukeg

+0

しかし、 'foo'は変数ではない関数だと考えてください。今はどうしていますか? – TheLogicGuy

0

いくつかのケースを除いて、オブジェクトを指すタイプのポインタ(すなわち、void *でなく、関数へのポインタではない)は、キャストのない他の種類の オブジェクトへのポインタには格納できませんタイプが修飾子を除いて同じ の場合準拠しているコンパイラは、そのルールが壊れている場合には 診断を発行する必要があります。その向こう

、標準は、いくつかの制限により、コードの側近が書かれたとして、 は、このようなキャストは、基本的に無用にする場合を除き、コンパイラが最適化を促進する名目 目的のために、無意味なファッションで ポインタをキャストするコードを解釈することができます。ルールが書かれたとき、大部分の コンパイラは、おそらく の規則の下で許容される最適化の約半分を実行しますが、理論的に可能なのはおそらく の5%になるので、ポインタキャストを賢明に処理します。しかし今日では、コンパイラ作者 が、意味があるかどうかにかかわらず、 標準によって最適化が許可されるすべてのケースを探し出す方が流行っています。gccのような

コンパイラは-fno-厳しいエイリアシングをブロックするオプションにそれは大きな利点と 少しリスクを提供するであろう場合は、だけでなく、それはほぼ確実に壊れる場合の両方の最適化のこの 種類を、持っています コードであり、実際のメリットはありません。彼らが に後者のみをブロックするオプションを持っていたら助けになるだろうが、私はそれを知らない。だから私の は、Dennis Ritchieの言葉のうち、非常に限られたサブセット でプログラムを作成しない限り、-fno-strict-aliasing という方言を対象にすることをお勧めします。

関連する問題