2010-05-01 3 views
1

Рассмотрим на примере нижеУказатели и адреса

int nCount[2] = {5,10}; 
int* ptrInt; 
ptrInt = nCount; 
cout<<ptrInt<<Endl;//this will print the address of arrar nCount 

Рассмотрим теперь этот

char *str = "Idle mind is a devil's workshop"; 
int nLen = strlen(str); 

char* ptr; 
ptr = new char[nLen+1]; 

strcpy(ptr,str); 

cout<<ptr<<endl;//this wil print the string 

, но это не должно быть печатанием адрес ул. Я не совсем понимаю.

ответ

7

С char* s часто используются для хранения строк, ostream operator<< перегружен для char*, чтобы распечатать указательную строку вместо указателя.

Если вы хотите вывести указатель, вы можете наложить указатель на void*, а затем вывести его.

1

Если вы хотите, адрес:

cout << (void *) ptr < <endl; 

< < оператор перегружен для многих типов - для полукокса *, он печатает строку, для пустоты * печатает адрес.

1

Ну, есть перегрузка для оператора потока, который имеет дело с char* как особый случай. Все остальные типы указателей используют перегрузку void*. Вот релевантная перегрузка оператора потока из стандартов:

basic_ostream<charT,traits>& operator<<(const void* p); // all types of pointers 

template<class charT, class traits> // except for c-strings 
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, 
const char*); 
+0

Стандартные потоки могут обрабатывать другие типы символов, но это всего лишь деталь, которую я бы не добавил к моему ответу. – AraK