2
#include<stdio.h>
int main(){
    int a[5] = {0,1,2,3,4};
    int * ptr;
    ptr =(int *) &a;
    printf("\n&a:%u,&a[0]:%u,ptr:%u\n",&a,&a[0],ptr);
    ptr = (int*)(&a+1);
    printf("\n&a:%u,&a[0]:%u,ptr:%u\n",&a,&a[0],ptr);
    ptr = (int*)(&a);
    ptr = (int*)(&a[0]+4);
    printf("\n&a:%u,&a[0]:%u,ptr:%u,*ptr:%d\n",&a,&a[0],ptr,*ptr);
    return 0;
}

o/p:

&a:3213284540,&a[0]:3213284540,ptr:3213284540

&a:3213284540,&a[0]:3213284540,ptr:3213284560

&a:3213284540,&a[0]:3213284540,ptr:3213284556,*ptr:4

上記のコード&a&a[0]は、同じアドレスを指定します3213284540。ただし、 を追加すると、2 つのケース1は異なるアドレスになります。

&a[0]+1 => 3213284540 + 4     = 3213284544   [The value stored in this address is '1']
&a+1    => 3213284540 + (5*4) = 3213284560   [Goes Out of bounds of the array] 

&a+1 is equivalent to sizeof(array)+1. 

しかし、コンパイラはこれをどのように解釈し&a[0]+1&a+1?

4

1 に答える 1

7

しかし、コンパイラがこの &a[0]+1 と &a+1 をどのように解釈するか

これはポインター演算であるため、指定された型と 1 つの基本的なことを知ることは常に重要です。1ポインターに追加すると、「次の」要素を指すようになります。

  • あなたの例&a[0]ではタイプint *なので、 1 を追加するとポインターが次の int に移動します。したがって、アドレスは、状況に応じて 4/8 バイトほど増加するはずです。sizeof(int)

  • ただし、&aタイプはint (*)[5]. したがって、それに 1 を追加すると、ポインターが次の配列に移動します。実際には、アドレスは だけ増加するはずsizeof(a)です。


補足:%pポインター値を出力するときに使用します。

于 2012-09-13T05:11:55.293 に答える