3

gcc コンパイラを使用して次の C プログラムを実行しようとしています。

#include <stdio.h>

int main()
{   
    int *a[] = {1,2,3,4,5,6};

    printf("\narr0=%d\n", *a);
    printf("arr1=%d\n", *(a+1));
    printf("arr2=%d\n", *a+2);
    printf("arr3=%d\n", *a+3);
    printf("arr4=%d\n", *a+4);

    return 0;
}

Output:-
arr0=1
arr1=2
arr2=9
arr3=13
arr4=17

*a+2、*a+3、*a+4 の括弧をスキップすると何が起こっているのか理解できません。*a+2 の場合、次のように操作します。

= *a+2
= *a+(4*2)           4 ->Size of int
= 1+(8)
So, *a+2 = 9

他の人にとっても同じです。

しかし、私は次のような出力を期待しています。(?)

arr0=1
arr1=2
arr2=3
arr3=4
arr4=5

私がポインターの配列を宣言した方法は、それを行うには良い方法ではありません。

ここで何が起こっているのか誰でも説明できますか?

4

2 に答える 2

5

小さな整数は通常、有効な整数ポインターではないため、無効なアドレスへのポインターの束を宣言しています。ちなみに、これについてコンパイラの警告が表示されるはずです。ここに質問を投稿する前に、それらを読んで修正することをお勧めします。または、少なくとも警告が表示されることを伝えてください。

これらのいずれかを逆参照するとすぐに、未定義の動作が発生します。

%p配列自体にインデックスを付け、間違った書式指定子を使用してポインターを出力するだけです (ではなくを使用する必要があります%d)。

于 2012-09-12T14:02:40.523 に答える
4

Unary*は binary よりも優先順位が高い+ため*(a + i)、 と*a + iは異なる方法で解釈されます。

*(a + i)と同等a[i]です。iの' 番目の要素を取得しているaので*(a + 2)、 と同じa[2]になります3

*a + iと同等a[0] + iです。はa[0]typeint *であるため、 の結果はafterへの ' 番目のポインタa[0] + iの値です。が 4 で に等しい場合、は 、は になります。 iinta[0]sizeof (int *)a[0]1*a + 15*a + 29

%pポインター値を出力するには、変換指定子を使用します。

printf("*a + 2 = %p\n", *a + 2);

配列にインデックスを付ける場合は、添字表記 ( a[i]) を使用します。ポインター表記の使用は混乱を招き、エラーが発生しやすくなります (ご存じのとおり)。

于 2012-09-12T15:01:34.157 に答える