14
#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;
}

誰かこのプログラムの出力について説明してくれませんか?

4

6 に答える 6

10

これは、ポインタに整数値を割り当てる(実装定義の)アクションが発生することを意味します。これは多くの場合、のメモリアドレスとのアドレスをp指していることを意味します。これらのメモリアドレスは、仮想メモリ、ハードウェアメモリにある可能性があり、多くの実装では、これらに対して異なる変換ルーチンがあります。60q40

これは実装定義であるため、実装で説明されているように、何かが発生する可能性があります。

しかし、これは完全に無価値ではありませんか?

確かにそうではありません。組み込みハードウェアプログラミングで、特定の機能にアクセスしたり、組み込み関数を呼び出したりするためによく使用されます。


ほとんどの場合、システムのint幅は4バイトなので、にp - q等しくなり(60 - 40) / 4 == 5ます。

于 2012-07-20T16:23:08.783 に答える
8

これpは、メモリアドレスを指し、メモリアドレス60q指します40。次に、おそらくアーキテクチャには4バイトintがあり、((60-40)/ 4)p - qに等しくなります。5

于 2012-07-20T16:24:54.830 に答える
1

2つのポインター値を作成してから、ポインター計算を実行しています。どうやらsizeof(int)あなたのシステムでは4バイトなので、2つのポインタ値の間の距離は5です。

于 2012-07-20T16:25:27.120 に答える
1

各ポインタpq、はintへのポインタです。pはメモリアドレス60とqメモリアドレス40を指します。qから減算するpと、その間に4バイトがいくつint収まるかがわかります。この場合は5です。これは、配列でポインタを使用しやすくするために行われます。同じ配列内。

ポインタ演算の詳細については、このサイトを参照してください。

于 2012-07-20T16:26:13.157 に答える
1

このステートメントは、アドレス60の整数へのポインターを宣言します

int *p = (int*) 60;  

あなたはおそらくすでにこれを知っています。これを行うことの危険性は次のとおりです。アドレス60に実際に整数が格納されていることをどのようにして知ることができますか?

于 2012-07-20T16:28:20.567 に答える
0

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。:)

于 2012-07-20T16:35:56.473 に答える