bugfix> arrays > 投稿
int i, paneerRoll[5]={89,45,35,2,3};
    printf("Element \t Address \t\t Value\n");
    for(i=0; i<5; i++)
    {
        printf("paneerRoll[%d] \t %p \t %d\n",i,&paneerRoll[i],paneerRoll[i]);
    }
    printf("\n\n\npaneerRoll \t %p \t %d\n",&paneerRoll,*paneerRoll);
    printf("(paneerRoll+2) \t %p \t %d",&paneerRoll+2,*(paneerRoll+2));

この部分のために

printf("(paneerRoll+2) \t %p \t %d",&paneerRoll+2,*(paneerRoll+2));

私の出力は

**(paneerRoll + 2)000000000061FE08 35 **

これは、配列のどの要素のメモリ位置とも等しくありません。 それで、このアドレス指定は何ですか?

回答 1 件
  • C標準から(6.3.2.1左辺値、配列、および関数指定子)

    3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array,an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array objectand is not an lvalue. If the array object has register storage class, the behavior is undefined.

    したがって、この式では

    *(paneerRoll+2)
    
    

    配列指定子 paneerRoll 配列の最初の要素へのポインタに変換されます。表現 paneerRoll + 2 配列の3番目の要素を指します。式の間接参照 *(paneerRoll+2) 配列の3番目の要素の左辺値を取得します。

    この表現は

    &paneerRoll+2
    
    

    次に、部分式 &paneerRoll タイプがあります int ( * )[5] 配列が占めるメモリエクステントのアドレス(配列の最初の要素のアドレスと同じアドレス)の値を持ちます。

    式を使用する

    &paneerRoll+2
    
    

    次のように計算されたアドレスを取得します ( char * )paneerRoll + 2 * sizeof( int[5] ) 割り当てられた配列から遠く離れている

あなたの答え