2

重複の可能性:
ポインターを含むCの質問

ポインタ、特に次の例について助けが必要です。

#include <stdio.h>
int main()
{
    int *i, *j;

    i = (int *) 60;
    j = (int *) 40;
    printf("%d", i - j);

    return 0;
}

このコードは10出力として生成されます。ここで正確に何をするのかを知る必要がi - jあります。

4

6 に答える 6

11

iおよびは、それぞれjメモリ位置60およびを指し40ます。

ここで行っているのは、ポインターの減算です。ijがバイト ポインタ (char *) である場合、予想どおり、i-jになります。20

ただし、他のポインターでは、2 つのポインター間の要素の数を返します。ほとんどのシステムで(int *)60 - (int *)405、これらの 20 バイトに 5 つの 4 バイト整数の余地があるため、 になります。どうやら、あなたのプラットフォームには 16 ビット整数があります。

于 2012-08-02T14:59:05.960 に答える
3

プログラムはおそらく と の間のポインターの違いを出力60し、 への40ポインターにキャストすることになっていますint。ポインターの違いは、アドレスからアドレスまで(排他的)にint配列に収まる の数です。4060

つまり、このプログラムは C 標準に違反しています。staticポインター演算は、ポインターが同じ ( 、自動または'd) 配列を指している場合を除いて未定義であり、 (代わりに使用)を使用mallocしてポインターの違いを確実に出力することはできません。%d%td

于 2012-08-02T15:01:13.490 に答える
1

これはポインタ演算であり、コードはintへi - jの2つのポインタを減算します。このような演算は、関連するデータサイズを認識しているため、この場合、2つのアドレス間の数が返されます。ints

の結果は、これを2バイト整数10のシステムで実行していることを示しています。との間には20個のメモリアドレスがあり、コードはを出力するため、2つのアドレスの間には2バイトがあります。ij1010ints

しかし、4バイトの整数を使用する別のシステムでは、との間で520個のメモリアドレスが出力されるため、2つのアドレスの間には4バイトがあります。ij5 ints

于 2012-08-02T15:00:56.300 に答える
0
printf("%d",i-j); return 0;

i と j は両方とも整数へのポインターであるため、ポインター演算に従います。ポインター数学に従って、整数へのポインターは常に sizeof(int) をシフトします。sizeof int が 4 である gcc コンパイラーを使用していると思います。60-40=20 ですが、単位が 4 であるため、出力は 5 です。

ただし、sizeof int が 2 のターボ c を使用すると、出力は 10 になります。

ノート

ポインターが式の評価に含まれている場合、それらはポインター演算に従います。

于 2012-08-02T15:03:52.907 に答える
-1

ianjは int 変数へのポインタです。つまり、int 変数の仮想アドレスを格納することになります。

この変数でポインタ演算を行うと、指している変数の型のサイズに基づいて実行されます。たとえば、int のサイズが 4 バイトの場合、値を からにi++増やします。6064

つまりi - j、環境では int のサイズが 2 であることを意味します。常に、その範囲に収容できるi - j(タイプの) 要素の量を示します。int

intしたがって、サイズintが 2 バイトの場合、60 から 40 の間で 10 個の要素を格納できます。

于 2012-08-02T18:08:00.713 に答える
-3

最初に、iとjと呼ばれる2つの整数ポインタが宣言されます。それらの値は、整数自体ではなく、ポインタが格納されているメモリアドレスであることに注意してください(ポインタの概念)。

次に、ポインタiとjがそれぞれ60と40に変更されます。これは、iとjが逆参照されなかったため、60と40の整数ではなく、メモリ内のスポットを表します。

次に、ijのメモリアドレスを出力し、その2つのメモリアドレスを減算します。

于 2012-08-02T14:59:52.530 に答える