2010-12-29 5 views
1

안녕 다음 코드는 휴대용입니까?값을 C로 전달

그냥 값으로 포인터를 전달하면 을 호출자의으로 변경할 수 있습니다!

void foo(void *p) 
{ 
void **pp = (void**)p; 
*pp = "hahaha"; 
} 

int main(int argc,char **argv) 
{ 
void *p = NULL; 
p = &p; 
printf("%p\n",p); 
foo(p); 
printf("%s\n",(char *)p);  // hahaha 
printf("%p\n",p); 


return 0; 
} 
+0

여기에 매우 인기있는 댓글이 있습니다. 단지 할 수 있기 때문이며 꼭 꼭해야한다는 뜻은 아닙니다. – Nim

+0

맞습니다. * 여전히 * (항상 그렇듯이) pass/call-by-value입니다. 답변을 참조하십시오. –

답변

3

항상 포인터로 포인터을 전달하면 포인터를 자신에게 할당 할 때와 함수에 전달할 때 하나의 포인터처럼 보입니다. 포인터가 그 포인터를 가리 키기 때문에 작동합니다. 당신이 무슨 일을하는지

은 기본적으로 이것이다 : 일부 캐스트와 트릭

void foo(void **p) 
{ 
    *p = "hahaha"; 
} 

int main(int argc,char **argv) 
{ 
    void *p = NULL; 
    printf("%p\n", &p); 
    foo(&p); 
    printf("%s\n",(char *)p);  // hahaha 
    printf("%p\n", p); 
    return 0; 
} 

추가. "어둠 속에서 카드 트릭"이라고 말하고 싶습니다. 그리고 진짜 프로그램에 넣는 것은 좋은 생각이 아닙니다.

표준에 따라 모든 데이터 포인터를 void *에 캐스팅 할 수 있다는 것이 문제이므로 (코드에서 항상 수행하는 작업 임) 다음 질문에 실제로 응답하려면 : 예, 이식성이 있어야합니다.

void 포인터에 불완전하거나 포인터 변환 또는 타입 객체가 될 수있다. 불완전한 또는 개체 유형에 대한 포인터는 void 에 대한 포인터로 변환 될 수 있습니다. 결과는 원래 포인터와 동일하게 비교되어야한다.

(C99, §6.3.2.3.1)

4

예, 변경할 수있는 포인터 점,하지만 당신은 할 만 할 수는 자체 포인터 지점을 만들어했기 때문에 : 예, 귀하의 질문에 대답하기 위해

p = &p; 

이식성이있다. 그러나 일반적으로 좋은 생각은 아닙니다.

2

당신은 실제로 포인터 포인터와 함께 연주하고 있습니다. 여전히 포인터를 값으로 전달하고 있으며 호출자의 값을 변경하기 위해 컴파일러를 속일 수는 없습니다. 포인터에 포인터가 가리키는 값만 변경하면됩니다.

실생활에서 자신과 동료 프로그래머를 혼란스럽게하는 것 외에는별로 좋은 생각이 아닙니다.

관련 문제