2017-11-21 7 views
2

포인터를 파악하려고하는데이 간단한 코드를 가지고 설명이 필요합니다.C++ pointer using using

하나의 char 배열을 다른 배열에 복사해야합니다.

const int MAX_SIZE = 100; 

char x[MAX_SIZE] = "1234565"; 
char* y = new char[MAX_SIZE]; 

copyArray(x, y);  
std::cout << y; 

delete [] y; 

지금 (돌기 잘 작동)이 코드를 어떻게하는지, 질문이 온다 : 내 주요 기능에이 코드가

while ((*dest = *source) != '\0') 
{ 
    dest += 1; 
    source += 1; 
} 

이에서 다름을 (말에 이상한 문자를 제공) :

while (*source != '\0') 
{ 
    *dest = *source; 

    dest += 1; 
    source += 1; 
} 

이 두 함수는 꽤 유사합니다. 원본 문자열에서 null 종결자가 될 때까지 복사하는 것이 좋습니다 (2 번째 기능)?

올바르게 작동하지 않습니다. 복사 된 배열의 끝에 이상한 문자가 표시됩니다. 그러나 첫 번째 기능은 정상적으로 작동합니다. 이 평가 된 후에

void copyArray(const char* source, char* dest); 
+0

맞아요. 제안 된 태그를 두 번 사용했습니다. 죄송합니다. – daavid245

+5

'while ((* dest = * source)! = '\ 0')'루프가 끝나기 전에 필요한 '\ 0' 끝. 또한 http://idownvotedbecau.se/nodebugging/을 참조하십시오. – user0042

+0

두 번째 예에서 문자열을 종료하지 않는다는 의미의 '\ 0'을 만나면 루프가 중단됩니다. – daavid245

답변

1

(*dest = *source)가 너무 int i = 1+1;의 1 + 1 부분과 같은 평가 식이고, 그 값은 다른 표현 가능하다

차이점은 ((*dest = *source) != '\0')에서의 값 * source가 * dest에 할당되면 *source이 가리키는 값은 *source != '\0'을 평가하는 데만 사용되지만 해당 계산식의 평가 중에는 할당되지 않은 반면에 전체 표현식은 평가됩니다 (표현식은 *source과 동일한 값을 가짐).


EDIT

user0042은 정말 급성 관찰을 가져온다 : 그래서

while ((*dest = *source) != '\0') 
{ 
    dest += 1; 
    source += 1; 
} 

배열의 마지막 문자가 '\ 0'

의 값이되도록 다음 코드를 수행하여
0

예에서 x, y의 주소를 증가 시키면 마지막 문자까지 널 (NULL) 종료자를 가리키고 임시 변수를 보유해야 함을 선언해야합니다 첫 번째 주소는 :

char* x = "1234565"; 
char* y = new char[MAX_SIZE]; 

// Temporary pointers to hold the first element's address 
char* tmp1 = x; 
char* tmp2 = y; 

while((*y = *x) != '\0'){ 
    x += 1; // X no longer points to the first element 
    y += 1; // Y no longer points to the first element 
} 

std::cout << tmp2; 
  • 당신은 while 대신 do while 루프를 사용할 수 있습니다

    char* x = "1234565"; 
    const int size = strlen(x); 
    char* y = new char[size]; 
    
    char* tmp1 = x; 
    char* tmp2 = y; 
    
    do{ 
        *y = *x; 
        x += 1; 
        y += 1; 
    }while(*(x - 1) != '\0'); 
    
    // Now no need for adding a null-terminator it is already added in the loop 
    // tmp2[size] = '\0'; 
    
    std::cout << tmp2; 
    

때문에 그래서 마지막 문자 \0 전에 루프를 중단됩니다 증가하기 전에 값을 할당 목적지 포인터 y에 추가됩니다. 따라서 나는 루프를 n = '\0'이 아니라 n - 1 = '\0'에 놓아서 y에 추가하도록했습니다.문자의 할당 ((*dest = *source))를 복사하는 것을

+1

그는 두 예제 모두에서'x'와'y'를 증가시킵니다 – Sirmyself

1

형태

while ((*dest = *source) != '\0') 
{ 
    dest += 1; 
    source += 1; 
} 

보장 도달 착신 '\0' 문자 false로 평가하는 경우 조건을 테스트하기 전에 적용된다.

*dest = *source; 

문이 이제까지 도달하기 전에 루프가 종료 때문에

번째 버전은 종료 '\0' 문자를 복사하지 않습니다.