2010-06-27 5 views
18
char *str = "Hello"; 

char *ptr = str; 
char *&rptr = str; 

ptr과 rptr의 차이점은 무엇입니까? 나는 rptr이 (이론적으로) 포인터에 대한 참조임을 이해하지만 ptr과의 구현 측면에서 어떻게 다릅니 까?포인터에 대한 참조

C++의 참조가 포인터를 사용하여 구현 되었습니까?

+0

가능한 중복 항목 : http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c http://stackoverflow.com/questions/620604/difference- 포인터 간 참조 매개 변수 http : // stackoverflow.com/questions/1948467/about- 포인터 및 참조 구문 그리고 아마도 더 ... – Alerty

+4

약 1 년 후에 코드가 무효화됩니다. 'char * '를 사용하여 약 10 년 동안 문자열 리터럴을 가리키는 것은 더 이상 사용되지 않습니다. –

+0

@ Johannes - 표준에서는 이러한 문자열 리터럴을 허용하지 않습니다. 대부분의 책은 여전히이 표기법을 사용합니다. 그런 세부 사항을 미리 볼 수있는 곳은 어디입니까? – Sam

답변

18

ptr과 rptr의 차이점은 무엇입니까?

char *world = "World"; rptr = world;을 입력 한 다음 str을 인쇄하면 "세계"가 인쇄됩니다. ptr = world;을 입력 한 다음 str을 인쇄하면 "Hello"가 인쇄됩니다.

+3

즉, rptr은 string의 별명이며 ptr은 단순한 사본입니다. str을 다른 곳으로 향하면 rptr에는 영향을 미치지 만 ptr에는 영향을 미치지 않습니다. 즉, str과 rptr은 2 개의 다른 변수 (2 개의 다른 이름)이지만 동일한 포인터라고 말할 수 있습니다. – apollodude217

+0

실제로 답변의 요지는 맞지만 "World"는'char * '포인터가 아니기 때문에'rptr = "World"를 할 수 없다는 것을 알아 두십시오. char 배열을 char 포인터로 암시 적으로 변환하는 것은 const가 아닌 참조이기 때문에 여기서는 수행되지 않습니다. –

+0

@ sepp2k 아직 잘못되었습니다. 무엇이 잘못되었는지 보여주는 코드를 수정하겠습니다. 이제 당신은 같은 상황에 처해있다 : 당신은 배열을 가지고 있지만 const가 아닌 참조를'char *'에 바인드하려고 시도하면 작동하지 않을 것이다. 그것은 마치'float a = 0; int &r = a;'실패합니다. 간과하기 쉽지만, 여기에 무엇이 있는지 한번 이해하면 쉽게 이해할 수 있습니다. –

5

이 시도 :

#include <iostream> 
int main() { 
    char *str1 = "Hello "; 
    char *str2 = "World!"; 
    char *ptr = str1; 
    char *&rptr = str1; 
    rptr = str2; 
    std::cout << ptr << str1 << std::endl; 
} 

그것은 인쇄에 "Hello World!" ptr이 문자열 리터럴 "Hello"를 가리키는 char 포인터이기 때문입니다. rptr은 char 포인터에 대한 참조이므로 포인터를 변경하면 (포인터가 아닌 포인터) str1을 변경합니다. 따라서 ptr은 "Hello"를 가리 킵니다. str1은 "세계!"를 가리 킵니다.

11

str은 메모리의 읽기 전용 세그먼트에 저장된 리터럴 문자열 "Hello"에 주소 (따라서 점)를 저장합니다.

ptr은 'str'과 동일한 주소를 가리 킵니다.

rptr은 기본적으로 'str'을 가리 킵니다 (str과 동일한 pointee는 아니지만 str 자체). 참조 용으로 'points to'를 사용하는 것은 드문 경우지만 포인터 자체에 포인터 (이 경우에는 포인터에 대한 포인터)와 매우 흡사합니다. 단, 구문상의 차이점과 제약 사항을 제외하고는 다른 포인터를 가리킬 수 없습니다. 일생.

이 유사 할 것입니다 : ((그것이 가리키는 무엇을 변경할 수 없습니다) 참조처럼

char** const rptr = &str; 

, 위의 새 주소를 할당 할 수 없습니다 RPTR하지만 그 pointee을 자유롭게 변경할 될 수있는 이 경우에는 'str'에 대한 포인터가됩니다).

*rptr = 0; // after this, str == 0 

참조 꽤 많이 읽기 전용 포인터 (안 읽기 전용 pointee을 변경 가능한 포인터)에만이 pointee (참조 자료)에서 얻을 수있는 역 참조 연산자를 필요로하지 않습니다와 동일합니다 :

char *str = "Hello"; 
char *&rptr = str; 
rptr = 0; // after this, str == 0 

포인터에 대한 읽기 전용 포인터 위의 예에서 유일한 차이점은 우리는 * 연산자를 사용하지 않은 것입니다.

const 참조에는 임시 속성의 수명을 연장 할 수있는 고유 한 특성이 있지만 이는 논의의 범위를 벗어날 수 있습니다.

관련 문제