2013-03-05 4 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

을 추가하는 것입니다 생각 : 그것은'* P B 형 A'가 아닌'A B의 *의 p'해야합니다. – dasblinkenlight

+0

예, 저도 했어요. Fixed – user2135885

+0

변경 저항을 위해 int b [sizeof (a)/sizeof (a [0])] = {...}를 사용하고 '5'값을 같은 용어로 대체하십시오. 이렇게하면 배열'a'을 바꿀 수 있으며 모든 것이 잘 될 것입니다. – glglgl

답변

9

당신은 정의되지 않은 동작을 얻고있다. 첫 번째 루프가 끝날 때 p은 "끝에서 한 끝"을 가리키고 b입니다. 다시 설정하지 않으면 참조를 취소하고 계속 증가 시키며 둘 다 의 정의되지 않은 동작을 발생시킵니다.

그것은 구현에 배열 a가 배열 b 후 즉시 저장되어 있고 p 배열 a으로 지적하기 시작했다고 할 수있다. 이것은 하나의 가능한 "정의되지 않은"bahaviour가 될 것입니다.

+0

그래서 기본적으로 아무 것도 될 수 있습니다.이 경우 메모리의 다음 주소를 가리키는 것처럼 보입니다.이 경우 배열의 시작 요소를 가리 킵니까? 내가 틀렸다면 나를 바로 잡아라. 감사합니다 – user2135885

+0

정확하게. 그것은 무엇이든 수 있습니다. 가장 좋은 경우는 충돌하기 때문에 일찍 잘못되었다는 것을 알고 있습니다. – UmNyobe

+0

@ user2135885 : 내게는 합리적인 설명처럼 보일지 모르지만, 우연의 일치에 대해 더 모호한 이유가있을 수 있습니다. –

-2

배열 값을 인쇄하고 증가시키기 위해 별도의 루프를 만들어서는 안됩니다. B에서 {}, P 점의 첫 번째 후 UR 출력을 얻기 위해 동일한 루프 모두를 수행하고 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] 일 수 있습니다.

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