2014-04-25 7 views
1

안녕하세요 저는 C 프로그래밍 언어의 초보자입니다. 최근에 저는 값으로 전화를하고 주소로 전화를했습니다. 호출 된 함수의 주소 변경에 의한 호출에서 호출 수신자를 반영한다는 것을 알게되었습니다. 그러나 다음 코드는 그렇게 작동하지 않습니다.주소를 전달하고 있지만 C의 값으로 호출하는 것처럼 작동합니까?

int x = 10,y = 20; 
void change_by_add(int *ptr) { 
    ptr = &y; 
    printf("\n Inside change_by_add\t %d",*ptr); 
    // here *ptr is printing 20 
} 

void main(){ 
    int *p; 
    p = &x; 
    change_by_add(p); 
    printf("\nInside main\t %d", *p); 
    // here *p is still pointing to address of x and printing 10 
} 

주소를 전달할 때 호출 된 함수의 변경 내용이 호출자를 반영하지 않는 이유는 무엇입니까?

+0

다운 유권자는 ur 코멘트를 언급 해주세요. 저에게 힘든 질문입니다. (초보자로서) 잘하면 지금은 u입니다. –

+1

코드 서식을 지정하려면 코드 단추를 사용하십시오. 당신이 물어 보았던 많은 질문들로, 당신은 정말로 이것을 지금 쯤 알아야합니다. – Gilles

답변

2

함수는 포인터에 새 주소를 할당하지만 모든 인수가 C에 있으므로 포인터 자체가 값으로 전달됩니다. 포인터 변수의 값을 변경하려면 포인터 자체의 주소가 전달되어야합니다 :

void change_by_add(int **ptr) 
{ 
    *ptr = &y; 
} 

change_by_add(&p); 

C FAQ Question 4.8을 참조하십시오.

참조에 의한 전달은 C에 존재하지 않지만 값이 변경 될 변수의 주소를 함수로 전달하면됩니다. 예를 들면 다음과 같습니다.

void add_to_int(int* a_value, int a_increment) 
{ 
    *a_value += a_increment; 
} 
+0

오자 '* ptr = y' – LumpN

+0

@LumpN, nope가 있습니다. 'y'는'int'이며'* ptr'은'int *'입니다. – hmjd

1

포인터가있는 변수의 값이 아니라 함수의 포인터 값을 설정하기 만하면됩니다. 이 함수는 다음 코드를 사용해야합니다.

* ptr = y;

이렇게하면 (포인터가 가리키는 값을 표시하는) 포인터의 우선 순위가 낮아 지므로 equals 연산자를 사용하면 포인터가 아닌 포인터가 수정됩니다. 나는 이것이 사물을 분명히하는 데 도움이되기를 바랍니다.

0

C로 주소 별 호출과 같은 것이 없습니다. 값으로 호출 만 있습니다. 함수가 호출자가 볼 수있는 방식으로 인수를 수정해야하는 경우 호출자가 포인터를 전달하고 호출 된 함수가 해당 포인터를 통해 업데이트를 작성하게하는 것입니다. 포인터 자체는 여전히 call-by-value로 전송됩니다. 즉, 호출 된 함수는 자체 포인터 복사본을 가져오고 원하는 경우 다른 포인터를 가리 키도록 변경할 수 있습니다.