2011-02-02 29 views
7

整数ポインタを整数に変換するときに何が起こるかを調べるためのコードを試してみましょう。整数ポインタから整数への変換

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
     int *p; 
     int a; 
     p = (int *)malloc(sizeof(int)); 
     *p = 10; 
     a = (int)p; 
     printf("%d\n",*p); 
     printf("%d \n",a); 
     return 0; 
} 

The output is : 10 
       135680008 

このコンバージョンに関連する概念は誰でも説明できますか?このトピックに関連して提供されたリンクも参考になります。

+1

私は本当に質問がここにあるのか分かりません。明らかにあなたがそのコードを書いていれば、どのように/なぜそれが動作し、あなたが得ている出力が期待どおりであるかを理解する必要があります。 –

+1

ちょうどメモ:それはもう不要にした後、 'free(p)'を持っていることを確認してください。方法では – xtofl

+0

、両方の変数はアドレスを保持しています:) –

答えて

11

明らかに、ポインタをポインタの内容と混同しています。

現実の世界と同様に、私は鳥を指していると私の人差し指を鳥に変換したいと言うことができます。しかし、「鳥」と「指」の間には関係がありません。

あなたのプログラムに類推する:あなたのintを指すオブジェクトをintに変換しています。 Cポインタは 'メモリセルの番号'として実装されており、個のメモリセルがあり、のメモリセルがあるため、(int)pは非常に大きな数値になることは明らかです。

キャスティングは厄介なことです。ポインタは整数に非常に似ています。 「thアドレスがthメモリバンク」のように実装されていた場合、明確な関係はなかったのでこの質問はしません。このキャストを行う。 mallocと割り当てられたメモリ領域のアドレス:

4

135680008pを指している(それはヘクスで0x8165008あろう)小数のアドレスです。

1

ここではメモリアドレスaを印刷していますが、符号付き10進整数として印刷しています。フォーマットとしてはあまり意味がありません。なぜなら、いくつかの高メモリアドレス、つまりワードサイズとコンパイラに依存する正確な境界が負の値として出力されるからです。

標準では、ゼロから8または16文字で埋められた符号なし16進数として印刷します(実際は、正確な単語サイズに依存します)。 printfでは、これは%#08Xとなるため、メモリアドレス0x243は0x00000243として出力されます。

関連する問題