2010-05-01 150 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 

,但不應該將這種打印str的地址。我沒有太大的區別。

回答

7

由於char* s經常用於存儲字符串,因此的輸出流operator<<被重載以打印出指向字符串而不是指針。

如果要輸出指針,可以將指針投射到void*,然後輸出該指針。

1

如果你想地址:

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

的< <運算符重載大量的類型 - 對於char *,它打印的字符串,無效*它打印的地址。

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 2010-05-01 18:24:08