#include <stdio.h>
int main()
{
int *p = (int*) 60; --- Line 1
int *q = (int*) 40; --- Line 2
printf("%d", p-q); //Output is 5
return 0;
}
誰かこのプログラムの出力について説明してくれませんか?
これは、ポインタに整数値を割り当てる(実装定義の)アクションが発生することを意味します。これは多くの場合、のメモリアドレスとのアドレスをp
指していることを意味します。これらのメモリアドレスは、仮想メモリ、ハードウェアメモリにある可能性があり、多くの実装では、これらに対して異なる変換ルーチンがあります。60
q
40
これは実装定義であるため、実装で説明されているように、何かが発生する可能性があります。
確かにそうではありません。組み込みハードウェアプログラミングで、特定の機能にアクセスしたり、組み込み関数を呼び出したりするためによく使用されます。
ほとんどの場合、システムのint
幅は4バイトなので、にp - q
等しくなり(60 - 40) / 4 == 5
ます。
これp
は、メモリアドレスを指し、メモリアドレス60
をq
指します40
。次に、おそらくアーキテクチャには4バイトint
があり、((60-40)/ 4)p - q
に等しくなります。5
2つのポインター値を作成してから、ポインター計算を実行しています。どうやらsizeof(int)
あなたのシステムでは4バイトなので、2つのポインタ値の間の距離は5です。
各ポインタp
とq
、はintへのポインタです。p
はメモリアドレス60とq
メモリアドレス40を指します。q
から減算するp
と、その間に4バイトがいくつint
収まるかがわかります。この場合は5です。これは、配列でポインタを使用しやすくするために行われます。同じ配列内。
ポインタ演算の詳細については、このサイトを参照してください。
このステートメントは、アドレス60の整数へのポインターを宣言します
int *p = (int*) 60;
あなたはおそらくすでにこれを知っています。これを行うことの危険性は次のとおりです。アドレス60に実際に整数が格納されていることをどのようにして知ることができますか?
int ポインタの初期化は、ポインタが整数のメモリ アドレスを指していることを確認するためのものです。この場合、ポインタ p と q のメモリ位置はそれぞれ 60 と 40 です。
出力が示しているのは、メモリの場所の違いです。通常、60-40 は 20 であると予想されますが、この場合は 5 になります。マシンでは各整数が 4 バイトまたは 32 ビットを占有するためです。
したがって、次のように考えることができます: 40 の最初の整数は 4 桁を占めるため、次の整数は 44、次に 48、次に 52 になります。したがって、メモリ位置の差を取得するとき、プログラムは各 4 バイト ブロックを 1 として取得します。ブロックであり、40 と 60 の間には 5 ブロックの差があります。
ポインター演算では、これは abs(mem_location1 - mem_location2)/sizeof(int) (つまり、整数が占めるバイト数) のように取得できます。
HTH。:)