2011-12-26 6 views
2

C에서 함수를 통해 참조로 전달할 때 함수의 매개 변수는 수정할 포인터의 주소를 사용한다는 것을 알고 있습니다. 나는 참조로 전달의 예제가 작동하지 않는 이유에 대해 궁금해. 누구든지 올바른 방향으로 나를 가리킬 수 있습니다 ....참조로 전달 참조를 통해 C

이 스왑을 출력해야하지만 스왑을 컴파일 할 때 참조가 작동하지 않는 이유는 무엇입니까?

#include <stdio.h> 

void swapnum(int *i, int *j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

int main(void) { 
    int a = 10; 
    int b = 20; 

    swapnum(&a, &b); 
    printf("A is %d and B is %d\n", a, b); 
    getchar(); 
    getchar(); 

return 0; 
} 
+2

합리적으로 현대적인 컴파일러를 사용한다면'int temp = i;'에 대한 경고를 받아야합니다.그 (것)들에게주의하십시오 ... 그들은 맞은 궤도에 당신 그러나 당신 할 수있다. – dmckee

+0

빠른 응답 시간을 보내 주신 모든 분들께 감사드립니다! 모두가 매우 도움이되었습니다. 나는 모든 사람들이 쓴 것을 읽은 후에 문제가 무엇인지를 이해합니다. 내 컴파일러는 경고했다. 비록 포인터의 주소를 int 데이터 형식으로 저장할 수 있다고 생각했지만. 나는 이것이 틀렸다는 것을 짐작한다. –

+0

우리는 C에서 그것들을 포인터라고 부릅니다. 그러나 다른 많은 언어에서 참조라고하는 것이 있습니다. –

답변

6

포인터를 함수 내에서 참조 해제하는 것을 잊었습니다. 따라서 포인터가 가리키는 실제 값을 변경하는 대신 로컬 포인터 값을 재 할당하면 효과가 없습니다. 당신은 포인터 (또한 값을 int)를 교환하는, swapnum에서

void swapnum(int *i, int *j) { 
    int temp = *i; 
    *i = *j; 
    *j = temp; 
+4

@Fred - 컴파일러 경고가 가능하다면, 포인터가 아니라 int temp에 int * i (포인터)를 할당했기 때문에 컴파일러 경고를 사용할 수 있습니다. 끝내지 않는 문제를 줄이기 위해 항상 경고가 활성화되도록 컴파일하려고합니다 ('-Wer -Werror' on gcc). –

1

당신이 원하는 :

는 그래서, * 참조 연산자를 사용합니다. 대신을 시도해보십시오 swapnum 기능에

void swapnum(int *i, int *j) { 
    int temp = *i; 
    *i = *j; 
    *j = temp; 
} 
1

:

int temp = *i; 
*i = *j; 
*j = temp; 
+0

크기가 호환 가능하다면 컴파일러는 할당을 수행하지만 포인터는 정확히 'int's가 아닙니다 (89 표준 이전의 개별 유형). 최대량은 또한 그것에 관하여 경고를 발행 할 것이다. – dmckee

3

, 당신은이 기능에 로컬 변수 ij를 할당한다. 이 함수 밖에서는 아무 효과가 없습니다. 당신이 시도해야합니다

void swapnum(int *i, int *j) { 
    int temp = *i; 
    *i = *j; 
    *j = temp; 
} 
2

그것은 (희망) 때문에이 기능에서 충돌 것 :

void swapnum(int *i, int *j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

ij 포인터이며, temp 것은 INT이다. int에 포인터를 할당 할 수 없습니다. 당신이 ij의 값을 교환하려는 경우이 작업을 수행 : 어떤 컴파일러 경고/오류가 발생하지 않은 이유가 궁금하네요

void swapnum(int *i, int *j) { 
    int temp = *i; 
    *i = *j; 
    *j = temp; 
} 
4

. 당신은 함수에서 참조를 역 참조해야합니다

void swapnum(int *i, int *j) { 
    int temp = *i; 
    *i = *j; 
    *j = temp; 
} 

이유는 함수가 호출 될 때 swapnum() 원래 변수에 주소입니다 내부 ij입니다. 따라서 i 또는 j 만 사용하면 콘텐츠가 아니라 변수의 주소가 표시됩니다. swapnum(int *i, int *j) 내부 그리고

int a = 10; 
int b = 20; 

     ----------------- 
0x1000 | 10   |    <-- a 
     ----------------- 
     ----------------- 
0x1004 | 20   |    <-- b 
     ----------------- 

swapnum(&a, &b); 

, : swapnum의

 ----------------- 
0x2000 | 0x1000  |    <-- i (*i == 10) 
     ----------------- 
     ----------------- 
0x2004 | 0x1004  |    <-- j (*j == 20) 
     ----------------- 
+0

자세한 설명을 주셔서 대단히 감사합니다. 이는 잘 진행되고있는 상황을 시각화하는 데 도움이됩니다. –

0

귀하의 구현() 조금 부적절한 여기 무슨 일이 일어나고 있는지의 생각이다. 이 함수는 2 (int *) 매개 변수를 사용합니다. 즉, i와 j는 a와 b의 참조를 저장하는 정수 포인터입니다. 당신이 int temp = i 할 때; 실제로 정수 변수 (올바르지 않은)에 대한 포인터를 할당하고 그 값을 바꾸는 대신 코드 스 니펫이 주소로 재생됩니다. 이것은 당신이 필요로하는 것입니다.

void swapnum(int *i, int *j) { 
    int temp = *i; 
    *i = *j; 
    *j = temp; 
}