2013-03-10 2 views
2

클래식 스왑 함수에서 두 포인터를 전달할 때 포인터가 가리키는 값은 바뀝니다. 그러나, 함수 호출이되면 간단한 함수C 언어 참조에 의한 호출

int leng (char *a) 
{ 
    int n; 
    for (n=0; *a!='\0'; a++) 
     n++; 
    return n; 
} 

에서, 포인터는 여전히 아닌 마지막 요소 어레이의 첫 번째 요소를 가리킨다. 왜 그런가요? 스왑 기능과 다른 점은 무엇입니까?

+0

http://c-faq.com/ptrs/passptrinit.html – hmjd

+0

이 질문에 대한 답변을 찾으십니까? – paddy

+0

질문하기 전에 FAQ를 확인하십시오. – Saju

답변

6

포인터 자체가 개체입니다. 이 경우, 포인터는 참조가 아닌 값으로 포인터를 전달하므로 포인터 자체의 변경 사항은 함수 외부에 반영되지 않습니다. 함수에서 포인터가 가리키는 객체를 변경하려는 경우 해당 변경 사항은 함수 외부에서 유지됩니다.

시도 :

int leng (char** a) 
{ 
    int n; 
    for (n=0; **a!='\0'; (*a)++) 
     n++; 
    return n; 
} 

leng(&pointer); 
1

그것은 실제로 swap 함수와 동일합니다 다음 swap 기능은 지적-에있는 값을 변경할 수 있습니다,하지만 당신은 포인터 자체를 변경하지 않습니다. 마찬가지로 lenga이 가리키는 문자열의 문자를 변경할 수 있지만 a 그 자체가 —으로 변경되어 다른 배열 요소 —을 가리 키도록 호출자가 볼 수 없습니다.

int leng (char **a) 
{ 
    int n; 
    for (n=0; **a!='\0'; *a++) 
     n++; 
    return n; 
} 

a에 대한 포인터 전달 : 당신이 그 변경을 원했습니다 경우

, 당신은 서면으로 그렇게 할 수 있습니다.

1

일반적인 포인터가 아닌 포인터를 가리키는 포인터가 필요할 수도 있습니다. (포인터 자체는 값에 의해 전달되며, 전달 된 포인터의 사본 값을 변경합니다.

2

포인터를 값으로 전달 중입니다. 포인터 값은 함수 호출 중에 스택에 복사됩니다. 스택 변수를 증가 시키면 함수가 반환 될 때 사라집니다.

관련 문제