重複の可能性:
ポインターを含むCの質問
ポインタ、特に次の例について助けが必要です。
#include <stdio.h>
int main()
{
int *i, *j;
i = (int *) 60;
j = (int *) 40;
printf("%d", i - j);
return 0;
}
このコードは10
出力として生成されます。ここで正確に何をするのかを知る必要がi - j
あります。
重複の可能性:
ポインターを含むCの質問
ポインタ、特に次の例について助けが必要です。
#include <stdio.h>
int main()
{
int *i, *j;
i = (int *) 60;
j = (int *) 40;
printf("%d", i - j);
return 0;
}
このコードは10
出力として生成されます。ここで正確に何をするのかを知る必要がi - j
あります。
i
およびは、それぞれj
メモリ位置60
およびを指し40
ます。
ここで行っているのは、ポインターの減算です。i
とj
がバイト ポインタ (char *) である場合、予想どおり、i-j
になります。20
ただし、他のポインターでは、2 つのポインター間の要素の数を返します。ほとんどのシステムで(int *)60 - (int *)40
は5
、これらの 20 バイトに 5 つの 4 バイト整数の余地があるため、 になります。どうやら、あなたのプラットフォームには 16 ビット整数があります。
プログラムはおそらく と の間のポインターの違いを出力60
し、 への40
ポインターにキャストすることになっていますint
。ポインターの違いは、アドレスからアドレスまで(排他的)にint
配列に収まる の数です。40
60
つまり、このプログラムは C 標準に違反しています。static
ポインター演算は、ポインターが同じ ( 、自動または'd) 配列を指している場合を除いて未定義であり、 (代わりに使用)を使用malloc
してポインターの違いを確実に出力することはできません。%d
%td
これはポインタ演算であり、コードはintへi - j
の2つのポインタを減算します。このような演算は、関連するデータサイズを認識しているため、この場合、2つのアドレス間の数が返されます。ints
の結果は、これを2バイト整数10
のシステムで実行していることを示しています。との間には20個のメモリアドレスがあり、コードはを出力するため、2つのアドレスの間には2バイトがあります。i
j
10
10
ints
しかし、4バイトの整数を使用する別のシステムでは、との間で5
20個のメモリアドレスが出力されるため、2つのアドレスの間には4バイトがあります。i
j
5
ints
printf("%d",i-j); return 0;
i と j は両方とも整数へのポインターであるため、ポインター演算に従います。ポインター数学に従って、整数へのポインターは常に sizeof(int) をシフトします。sizeof int が 4 である gcc コンパイラーを使用していると思います。60-40=20 ですが、単位が 4 であるため、出力は 5 です。
ただし、sizeof int が 2 のターボ c を使用すると、出力は 10 になります。
ポインターが式の評価に含まれている場合、それらはポインター演算に従います。
i
anj
は int 変数へのポインタです。つまり、int 変数の仮想アドレスを格納することになります。
この変数でポインタ演算を行うと、指している変数の型のサイズに基づいて実行されます。たとえば、int のサイズが 4 バイトの場合、値を からにi++
増やします。60
64
つまりi - j
、環境では int のサイズが 2 であることを意味します。常に、その範囲に収容できるi - j
(タイプの) 要素の量を示します。int
int
したがって、サイズint
が 2 バイトの場合、60 から 40 の間で 10 個の要素を格納できます。
最初に、iとjと呼ばれる2つの整数ポインタが宣言されます。それらの値は、整数自体ではなく、ポインタが格納されているメモリアドレスであることに注意してください(ポインタの概念)。
次に、ポインタiとjがそれぞれ60と40に変更されます。これは、iとjが逆参照されなかったため、60と40の整数ではなく、メモリ内のスポットを表します。
次に、ijのメモリアドレスを出力し、その2つのメモリアドレスを減算します。