7
#include <stdlib.h>
#include <stdio.h>

int main (void)
{
    int a[] = {1,2,3,4,5};
    int b[] = {0,0,0,0,0};
    int *p = b;

    for (int i =0; i < 5; i++)
    {
        b[i] = a[i]+1;
        *p = a[i]+1;
        p++;
    }
    for (int i = 0; i < 5; i++)
    {
        printf (" %i \t %i \t %i \n", *p++, b[i], a[i]);
    }
    return 0;
}

このコードでは、a と b の出力の理由がわかりますが、ポインターの値が同じなのはなぜですか?

※pはb[0]=a[0]+1ですね。したがって、p++ は b の次のアドレスオーバーを意味するため、b[1]=a[1]+1 です。

ie 
*p  b  a
1  2  1
2  3  2
3  4  3
4  5  4
5  6  5
4

4 に答える 4

9

未定義の動作が発生しています。最初のループの最後で、 の「最後のp1 つ後」を指しbます。リセットせずに逆参照してインクリメントし続けると、未定義の動作が発生します。

実装では、配列が array の直後に格納され、それが array を指し始めている可能性があります。これは、考えられる「未定義」の動作の 1 つです。abpa

于 2013-03-05T13:24:50.033 に答える
1

最初の for{},p の後、b[5] をポイントしますが、b のサイズは 5 であるため、b[5] の値は不明です。printf *p は a[i] と同じ値です。理由は次のとおりです。メモリ内の b[5] は a[0] です。

于 2013-03-05T14:46:37.350 に答える
1

あなたがする必要があるのは、追加することだと思いますp = p - 5;

#include <stdio.h>
int main (void)
{
    int a[] = {1,2,3,4,5};
    int b[] = {0,0,0,0,0};
    int *p = b;
       int i =0;

    for (i =0; i < 5; i++)
    {
        b[i] = a[i]+1;
        *p = a[i]+1;
        p++;
    }
    p = p - 5;
    for (i = 0; i < 5; i++)
    {
        printf (" %i \t %i \t %i \n", *p++, b[i], a[i]);
    }
    return 0;
}
于 2013-07-12T06:07:16.653 に答える
-2

配列の値を印刷およびインクリメントするために別のループを作成しないでください。両方を同じループで実行し、以下を実行して出力を取得します:) #include #include

int main(void)
{

int a[]={1,2,3,4,5};
int b[]={0,0,0,0,0};
int c[]={0,0,0,0,0};
int *p;
int i;
p=c;
for( i =0 ; i<5 ; i++)
{
    b[i]=a[i]+1;
    *p=b[i]-1;
    //*p++;

//for( i =0 ; i<5 ; i++)

    printf(" %i \t %i \t %i \n" ,*p,b[i],a[i]);

}
return 0;
}
于 2013-03-05T14:44:16.820 に答える