2010-08-08 4 views
6

나는 스택 오버플로 게시물을 읽고, 그리고 난이 기능을 보았다사람들은 왜 char * & buf와 같은 것을 사용합니까?

advance_buf(const char*& buf, const char* removed_chars, int size); 

char*& buf 여기에 무엇을 의미 하는가 사람들이 왜 그것을 사용합니까?

+3

이것은 C++에만 해당되며 C에서는 의미가 없습니다. 태그를 변경하고자 할 수 있습니다. –

+1

C에 참조가 없으므로 태그를 "C++"로 전환했습니다. –

+1

[book] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)는 인터넷에서 스크랩을 가져 오는 것보다 훨씬 충분한 정보를 제공합니다. – GManNickG

답변

13

즉, buf은 포인터에 대한 참조이므로 해당 값을 변경할 수 있습니다 (포인팅 영역의 값은 물론).

나는 C에서 오히려 부실 해요,하지만 AFAIK C에서의 참조가 없습니다이 코드는 (주 문제는 원래 태그 된) C++ 입니다. 당신이 buff-NULL을 할당 할 수 있는지 물었다 @brett 코멘트에서 그리고 만약 포인터를 통해 참조를 사용의 장점은 그래서 여기서 예를 들어

:

void advance(char*& p, int i) 
{  
    p += i; // change p 
    *p = toupper(*p); // change *p 
} 

int main() { 
    char arr[] = "hello world"; 
    char* p = arr; // p -> "hello world"; 
    advance(p, 6); 
    // p is now "World" 
} 

편집. 더 나은 가시성을 위해 여기에 답변을 드리겠습니다.

buff에을 할당 할 수 있습니다. 그것은 오류가 아닙니다. 누구나 말하는 것은 char **pBuff을 사용하는 경우 은 NULL (char** 유형)이거나 *pBuff (char* 유형) 일 수 있습니다. char*& rBuff을 사용할 때 rBuff은 (char* 유형의) NULL 일 수 있지만 char** 유형의 엔티티는 NULL 일 수 없습니다.

+0

사람들이 왜이 같은 것을 사용합니까? 이것을 사용하면 어떤 이점이 있습니까? char ** buf를 사용하는 것도 효과가 있을까요? 깨끗한 인터페이스를 제공합니까? – brett

+0

그 포인터는 가비지 또는 NULL을 가리킬 수 있지만 참조는 항상 유효합니다. –

+0

포인터보다 참조를 사용하여 코드를 작성하는 것이 가장 깨끗하지만, 기본적으로 char * &는 문자와 동일한 문자입니다. – ggarber

4

buf 님의 포인터에 대한 (C++) 참조입니다. 당신은 advance_buf을 호출하는 함수에서 const char *foo을 가질 수 있고 포인터를 변경할 수있는 advance_buf이 있습니다. 변경 사항은 호출 함수에서도 볼 수 있습니다.

관련 문제