2009-12-28 5 views
7

함수에서 포인터를 어떻게 전환합니까?C 프로그래밍 언어의 함수에서 포인터 전환

void ChangePointers(int *p_intP1, int *p_intP2); 

int main() { 

int i = 100, j = 500; 
int *intP1, *intP2; /* pointers */ 
intP1 = &i; 
intP2 = &j; 
printf("%d\n", *intP1); /* prints 100 (i) */ 
printf("%d\n", *intP2); /* prints 500 (j) */ 
ChangePointers(intP1, intP2); 


printf("%d\n", *intP1); /* still prints 100, would like it swapped by now */ 
printf("%d\n", *intP2); /* still prints 500 would like it swapped by now */ 
}/* end main */ 

void ChangePointers(int *p_intP1, int *p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = p_intP2; 
p_intP2 = p_intP1; 
p_intP1= l_intP3; 
} 
+5

C에서는 * everything *이 값으로 전달됩니다. 함수가 무언가를 변경하기를 원한다면 포인터를 전달해야합니다. 그래서 포인터를 변경하는 함수가 필요하면 포인터를 포인터에 전달해야합니다. 포인터를 가리 키십시오. 일단 당신이 그렇게 생각하기 시작하면, 모든 것이 (모든 것이 아니라, 적어도 기능 호출이라면) 쉽게된다. –

답변

14

, 매개 변수는 항상 의해 전달 값. 호출 된 함수 내에서 포인터 변수의 값을 변경하더라도 변경 사항은 호출 함수로 다시 반영되지 않습니다. 해야 주에서

void ChangePointers(int **p_intP1, int **p_intP2); /*Prototype*/ 

void ChangePointers(int **p_intP1, int **p_intP2) /*Definition*/ 
{ 
    int *l_intP3; /* local for swap */ 
    l_intP3 = *p_intP2; 
    *p_intP2 = *p_intP1; 
    *p_intP1= l_intP3; 
} 

대응 호출() :이 일을 시도

이 모든 답변에 추가
ChangePointers(&intP1, &intP2);/*Passing in the address of the pointers instead of their values*/ 
+0

좋아, 정말 고마워! –

5

포인터를 포인터로 사용하도록 서명을 변경하십시오.

void ChangePointers(int **p_intP1, int **p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1= l_intP3; 
} 

또는 호출 코드가 C++ 참조와 비슷하게 보이도록하려면 매크로를 사용하십시오.

void ChangePointersImpl(int **p_intP1, int **p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1= l_intP3; 
} 

#define ChangePointers(a,b) ChangePointersImpl(&a, &b) 
2

함수 내에서 포인터의 로컬 값을 변경하려고합니다. 함수가 종료되면 변경 사항이 유지되지 않습니다. 당신이 포인터가 가리키는 값을 변경하려는 경우, 당신이 원하는 :

int intP3; /* local for swap */ 
intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1 = intP3; 

당신이 포인터의 값을 변경하려면

자체 (예 : 주소)를 사용하면, 그 포인터에 포인터를하지 통과해야 포인터 그 자체.

13

포인터에 대한 포인터가 필요합니다. 당신이 포인터를 전환하려면

ChangePointers(&intP1, &intP2); 

void ChangePointers(int **p_intP1, int **p_intP2) { 
     int *l_intP3; 
     l_intP3 = *p_intP2; 
     *p_intP2 = *p_intP1; 
     *p_intP1 = l_intP3; 
} 
1

, 다음 패스에서하는 포인터가 아닌 포인터 값의 주소를해야합니다 : C에서

void ChangePointers(int **p_intP1, int **p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1= l_intP3; 
} 
2

, 난 그냥 추가 싶었던 나는 상황에서 포인터를 이해하는 데 문제가 될 때 이처럼 나는 int와 같은 더 단순한 것으로 가져갈 것입니다. 당신이 함수에 int를 통과한다면 말 :

int x = 10; 
change_int(x); 
printf("%d",x); 
void change_int(int y) 
{ 
    y = 20; 
} 

x는 분명히 아직 실제로 X를 변경하려면 (10)를 인쇄합니다, 당신은 당신이 직접 X를 수정할 수 있도록 X에 대한 포인터를 전달해야합니다.

int x = 10; 
change_int(&x); 
printf("%d",x); 
void change_int(int *y) 
{ 
    *y = 20; 
} 

이제 x는 20을 인쇄합니다. 이제 x가 포인터 인 것처럼이 동일한 추론을 적용한 다음 이중 포인터를 전달해야합니다. 희망이 도움이됩니다.

1

설명한 다른 유사한 질문은 here을 참조하십시오. 이 글을 읽으면 위의 다른 대답을 더 쉽게 이해할 수 있습니다.

호프가 도움이 되었으면 안녕하세요, 탐.

관련 문제