1
#include <stdio.h>
main()
{
    int a[] ={ 1,2,3,4,5,6,7};
    char c[] = {' a','x','h','o','k'};
    printf("%d ", (&a[3]-&a[0]));
}

プログラムの出力は3です。しかし、以下で得られた値の出力の違いは12です。誰かがあいまいさを説明してください。

#include <stdio.h>
main()
{
    int a[] ={ 1,2,3,4,5,6,7};
    char c[] = {' a','x','h','o','k'};
    printf("%d     %d ", &a[3],&a[0]);
}
4

4 に答える 4

2

これはポインタ演算と呼ばれます。結果は、値を で割った値になります。sizeof(int)

バイト数の差が 12 で、サイズintが 4 の場合、結果は次のようになります。12/4=3

ところで、住所を印刷するときは、フォーマット指定子を使用します%p

printf("%p     %p ", &a[3],&a[0]);
于 2012-10-20T17:47:28.757 に答える
1

最初のケースでは、演算子'-'がポインタに適用され、結果は絶対アドレスではなく要素数で測定されます。これをチェックしてください: Pointer Arithmetic

于 2012-10-20T17:54:44.383 に答える
0

まず第一に、コンパイラによってa[i]自動的に変換されます (これの興味深い結果については、https://stackoverflow.com/a/1995156/226621を参照してください)。したがって、は、またはと同じです。この意味は:*(a+i)&a[i]&*(a+i)a+i

&a[3]-&a[0]

と同じです

(a+3) - (a+0)

です3。これはまた、 forpqがどちらもある型へのポインタでありT(つまり、*p*qが 型であるT)、p-qが有効な場合、 と の間の型の要素の数を示すこともT意味します。コンパイラは、 と の値の差を自動的に変換し、その差をで割って正しい数を求めます。pqpqsizeof(T)

したがって、個々のポインター値を出力し、それらの値を自分で (たとえば、頭の中で) 減算すると、sizeof(T)「大きすぎる」数値が得られます。

あなたのマシンでは12 / sizeof(int) == 3、つまりsizeof(int)4 です。

ちなみに、ポインター値を出力するには、%p指定子を使用する必要があります。

printf("%p %p\n", (void *)&a[3], (void *)&a[0]);
于 2012-10-20T18:12:21.737 に答える
0

あなたは住所を印刷しています

#include<stdio.h>
main()
{
 int a[] ={ 1,2,3,4,5,6,7};
char c[] = {' a','x','h','o','k'};
printf("%d     %d ", &a[3],&a[0]);

}

結果

-1085768040     -1085768052 

コードパッド

そして最初の1つは Binyamin Sharet の答えは完璧です

于 2012-10-20T17:46:49.017 に答える