2013-03-05 9 views
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の出力が得られるのですか?しかし、ポインタにはなぜ同じ値がありますか?cポインタと配列

* 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 
+0

あなたの列を誤ったラベルを追加することです。 – dasblinkenlight

+0

ええ、私は悪いです。 – user2135885

+0

変更抵抗のために、int b [sizeof(a)/ sizeof(a [0])] = {... 'を置き換え、同じ用語で '5'の値を置き換えてください。このようにして、配列 'a'を変更することができ、すべてがOKになります。 – glglgl

答えて

9

あなたは未定義の動作を得ています。最初のループの最後でpは "最後を過ぎたもの"を指しますbです。それをリセットせずに、逆参照してインクリメントを続けると、どちらもの未定義の動作が発生します。

それ実装上のアレイaは、アレイbの直後に格納されているとpが配列aに指すように開始したことかもしれません。これは1つの可能な "未定義の"バーハビールになります。

+0

なので、基本的には何でも構いません。この場合、メモリの次のアドレスを指すように見えます。この場合、配列aの開始要素を指していますか?私が間違っているなら、私を修正してください。ありがとう – user2135885

+0

正確に。それは何でもよい。最善のケースはクラッシュして、何かが間違っていることを早期に認識しているということです。 – UmNyobe

+0

@ user2135885:私には合理的な説明のように思えますが、あなたが見ている偶然の理由がより明白でない可能性があります。 –

-2

あなたは配列の値を印字してインクリメントするために別のループを作ってはいけません。 bの{}、P点の最初後ウル出力を得るために、同じループの両方を行うとfollouwingを行う:) の#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; 
} 
1

[5]が、Bの大きさは5でありますb [5]の値が不明であるため、printf * pはa [i]と同じ値です。理由はメモリb [5]がa [0]である可能性があります。それは、 `* pをB型A`ではなく、` b *表p`する必要があります:私はあなたが何をする必要があるかと思います

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; 
} 
+0

: 'p = b'がもう一度、' 5'が変わる可能性があります。 – glglgl