ostream類中對運算符<<的重載(void*與char*)
因為之前一直對cout<<輸出有著很大的疑惑,例如以下代碼中的輸出疾党,對于整型指針輸出的是地址,而對于字符指針輸出的是字符串肺孤。
#include <iostream>
int main()
{
int a = 1;
int *aptr = &a;
std::cout << aptr<<std::endl;
char *b = "string";
std::cout << b<<std::endl;
/*輸出
00EFF760
string
*/
}
查閱了相關(guān)資料之后,我得知C++中ostream類對于運算符<<有重載,傳入不同參數(shù)的時候會有不同的效果眠菇。
以下是一個小測試毁枯,證明上述結(jié)論慈缔。
#include <iostream>
#include<string>
int main()
{
using namespace std;
char *str = NULL;
cout << "&str=" << &str<<endl; //str指針存放的地址
//cout << "str=" << str << endl; //str指針的值為空,異常
cout << "str =" << (void*)str << endl; //強制類型轉(zhuǎn)換為空指針种玛,可以輸出其空值為0
//int*a=NULL;cout << a;
/*輸出
&str=012FFC7C
str =00000000
*/
cout << "-------這里是分割線--------" << endl;
str = new char[20];
str = "string";
cout << "&str=" << &str << endl; //str指針存放的地址,與上面相同
cout << "str =" << str << endl; //str指針所指向的字符串
cout << "str =" << (void*)str << endl; //字符串的首地址
cout << "*str=" << *str << endl; //輸出字符數(shù)組第一個元素
void *test = str;
cout << "test=" << test<<endl; //字符串的首地址
/*輸出
&str=00C4F8E4
str =string
str =00CB9B64
*str=s
test=00CB9B64
*/
//由此可以看出頭文件ostream中藐鹤,運算符<<對void*和char*有著不同的運算符重載,導致了輸出結(jié)果不同
str = '\0';
delete[] str;
return 0;
}
翻閱C++PrimerPlus可以得知
ostream類還為下面的指針類型定義了插入運算符函數(shù)
const signed char*;
const unsigned char*
const char*;
void *;
由此可見C++對于char*是有差別對待的赂韵,對char*s輸出的是字符串娱节,而其他指針例如double*,float*祭示,int*等等使用的是void*這個重載肄满。所以輸出的才是地址值
以下對void*進行簡單探尋。
void指針
void指針表示的是空類型指針,但實際指代的是任意類型指針稠歉,我們經(jīng)酬#可以在函數(shù)形參中發(fā)現(xiàn)它,實際上怒炸,空類型指針只能儲存地址带饱,但是不可以對空指針進行類似于自增,解引用等操作阅羹。個人現(xiàn)在感覺空指針特別有用纠炮。
輸入流中對于字符指針的思考
以前經(jīng)常犯的錯誤便是
char *s;
std::cin>>s;
這樣每當輸入一個字符串之后程序便出現(xiàn)無法將值輸入字符指針s了,最近讀了C++PrimerPlus的關(guān)于字符串的部分灯蝴,有了很深刻的認識恢口,意識到必須給char*s這個字符指針new一個空間,才可以在cin>>對其進行更改
#include<iostream>
#include<string>
int main()
{
std::cout << "Enter the word" << std::endl;
char *s=new char[100];
std::cin >> s;
int count=0;
while (strcmp(s, "#") != 0)
{
count++;
std::cin >> s;
}
std::cout << count << "words"<< std::endl;
return 0;
}
小結(jié)
在學校用的那本C++課本實在是太淺了穷躁,頂多只能入個門耕肩,真正想理解原理還得找老外的書看。自己這篇關(guān)于C++也是參考了很多資料才寫出來的问潭,深感不易猿诸,而且可能會有不少錯誤,望指出狡忙。
參考資料:
http://blog.csdn.net/ncepuwanghui/article/details/23712735
http://blog.csdn.net/yahohi/article/details/7551876
http://blog.sina.com.cn/s/blog_8961925401016t9y.html
《C++PrimerPlus第6版中文版》