2013-11-25 5 views
1

나는 포인터와 새로운 오전 나는 변수 B에 변수 의 값을 변경하는 기능, 변수 에 변수 B의 가치를 창출하기 위해 노력하고 있어요.포인터로 변수의 값을 변경 하시겠습니까?

나는 함수를 제외하고는 모든 것이 있다고 생각한다. 함수에서 나는 포인터 의 값을 (* a)으로 만들고 값 포인터 b이 있고 부사장을 할당하려고합니다. 그러나 제 출력물은 "a는 이제 y이고 b는 이제 y"입니다.

내가 할당 할 때 *는 B에, B을 얻을 것이다 때문입니다 * 단지 Y에 변경된의 가치인가?

#include <stdio.h> 

void change(char* a, char* b) 
{ 
    *a = b; 
    *b = a; 
} 

int main(void) 
{ 

    char a = 'x'; 
    char b = 'y'; 


    printf("a is now %c and b is now %c\n", a, b); 

    change(&a, &b); 

    printf("a is now %c and b is now %c\n", a, b); 

    return 0; 
} 
+0

* a = b 다음에 a = 'y'를 넣을 것이고 b = a이면 b = 'y'가됩니다. –

답변

6

귀하의 change 기능은 잘못된 것입니다 :

void change(char* a, char* b) 
{ 
    char temp = *a; 
    *a = *b; 
    *b = temp; 
} 

먼저 임시 변수를 만들 -이 임시 변수에 복사 한 다음 값을 교환합니다. 이 행은 UB입니다.

*a = b; 
*b = a; 

포인터의 값을 char에 저장하려고합니다.

+0

스왑 함수의 모든 예는 'temp'라는 변수를 임시 복사. 그 이름을 그 변수에 넣지 않으면 작동하지 않는 것 같습니다 : D –

+0

@ user3032809 - 환영합니다 :) – Sadique

0

예, 첫 번째 할당은 두 번째 할당에서 필요한 값을 덮어 씁니다.

이 솔루션은 스왑 동안 변수 값 중 하나를 잡아 약간의 임시 저장소를 사용하는 것입니다

void change(char *a, char *b) 
{ 
    const char old_a = *a; 
    *a = *b; 
    *b = old_a; 
} 

이 (사용하여 비트 단위 XOR) 주위에 이동 할 수있는 트릭도 있습니다 만 무서워서이 시점에서 무시하십시오.

관련 문제