2014-10-04 2 views
1

어떻게 char 변수의 주소를 표시 할 수 있습니까? 나는 int 형 또는 부동 형 또는 void 형으로 변환 한 주형에 의한 형변환을 사용하고 포인터를 사용하여 주소를 표시하는 해결책을 찾았습니다. 그러나 타입 캐스팅이없는 특정 솔루션에 대한 대안이 있습니까?포인터를 사용하여 C++에서 char 변수의 주소를 표시 하시겠습니까?

char var = 'a'; 
char* ptr; 
ptr = &var; 
cout << ptr; 

과 같은 포인터를 사용하지만이 경우에도 포인터는 var의 주소를 가리키고 있지만 var의 값을 표시합니다. 왜? 그렇다면 포인터를 사용하여 var에 대한 주소를 어떻게 얻을 수 있습니까? 타입 캐스팅

cout << "Address of var = " << static_cast<void*>(&var) << endl; 

를 사용하지 않고, 또는 우리는 특정 문제에 대한 어떤 연산자를 오버로드 할 수 있나요? std::ostream문자의 제로 종료 배열의 첫 번째 요소에, 지정된 포인터 포인트가을지지 char *위한 특별한 과부하를 가지고 행복하게 통과하려고하기 때문에 당신이 캐스트를 작성해야

+1

'cout << (void *) ptr;' –

+4

정확하게 타입 캐스팅에 문제가 있습니까? –

+0

당신이 [여기]에 자세히 답을 찾을 수 있습니다 –

답변

7

유일한 이유는 그 배열이 제로에 도달 할 때까지.

불행하게도 한 문자의 주소를 전달하고 해당 주소의 값을 인쇄 할 수 없기 때문에 캐스팅이 필요한 것입니다. 다른 모든 (문자가 아닌) 포인터의 경우 std::ostream은 이미 포인터 값의 숫자 표현을 인쇄합니다.

"할 수있는 것"이 ​​없지만 이미 해결책을 발견 했으므로 실제로는 문제가되지 않습니다. 일반 설정에서 오브젝트 포인터를 인쇄하려면 void *에 캐스트를 추가하면 모든 입력 유형에 사용할 수 있습니다. std::ostream의 동작은 대다수의 유스 케이스가 쉽게 작성되도록 편의를 위해 설계된 선택의 결과로, 특정 유스 케이스를 작성하는 데 좀더 장황하게 만듭니다.

+0

char *를 오버로드 할 수 있습니까? –

+1

@FaisalNaseer : 이해가 안됩니다. 물론 오버로드가 어떻게 작동하는지 알지만, 중요한 점은'std :: ostream' * 이미 * 과부하가 있습니다. 표준 라이브러리의 일부를 재정 의하여해서는 안됩니다. (당신은 잠재적으로 자신의 스트림 클래스를 작성하여 그에 대한 과부하를 정의 할 수 있습니다.) –

+2

@FaisalNaseer는 동일한 서명으로 두 개의 오버로드를 정의 할 수 없으며, 원하는 것을 수행하는 함수를 사용할 계획을 세우고 (결국, 타입 변환이 될 것입니다.), 특정 이슈에는 아무런 의미가 없습니다 –