問題描述
在C/C++
編程中,如果對char[]和char*對象進行比較,當然一般來說可以使用strcmp
方法,但是如果直接使用==
會產生什麼結果呢,如下面的程序:
#include <iostream>
using namespace std;
int main() {
char strArray1[] = "abc";
char strArray2[] = "abc";
cout << boolalpha << (strArray1 == strArray2) << endl;
char* strPointer1 = "abc";
char* strPointer2 = "abc";
cout << boolalpha << (strPointer1 == strPointer2 ) << endl;
}
注: boolalpha
方法是爲了以true或者false的方式打印
這個程序很簡單,不需要太多的解釋。
最後打出的結果可能會感覺應該都是false
,但是實際的結果是:
第一個打出的是false
,而第二個打出的是true
問題分析
那麼爲什麼會有這種結果呢,首先需要知道的是==
比較的不是指向的內容abc
,比較的是各個str
對象中存儲的是指向內容的地址,換句話說就是abc
的地址,是它們本身的存儲的值。
Array
對象
對Array
對象來說,是運行時在棧空間上分配的內存,所以每個對象都是單獨去申請內存,各自保存一份自己的abc
,所以Array
對象存儲的地址也是不一樣的,所以第一個結果是false
;Pointer
對象
對Pointer
對象來說,兩個字符指針並沒有分配相應的存儲區,是後面的abc
是以常量的形式存在常量區,然後把首地址的值賦值給了Pointer
對象,所以Pointer
對象存儲的地址應該來說是一樣的,所以第二個結果是true
;
注意事項
其實可以想到通過打印相關的地址來查看結果是否正確,但這裏會有個問題:
數組對象
下面直接打印數組對象,其實是打印的數組對象的內容,結果都是abc
cout << strArray1 << endl;
cout << strArray2 << endl;
對於數組對象可以這樣打印數組的首地址,可以從這裏看出這兩個地址是不同的,即兩個abc
存儲在不同的空間
cout << &strArray1 << endl;
cout << &strArray2 << endl;
指針對象
下面直接打印指針對象,其實是打印的也是指針對象的內容,結果都是abc
,這樣打印按道理來說應該是打印的字符串的首地址,是因爲對cout
進行了重載,打印字符指針時,給出地址不是打印地址內容,而是打印相對的字符的內容,所以會得到abc
結果
cout << strPointer1 << endl;
cout << strPointer2 << endl;
但是如果取該指針的地址來打印的話,結果兩個地址是不對的,因爲此時打印的不是指向的字符串的首地址了,而是該指針的地址,當然不一樣
cout << &strPointer1 << endl;
cout << &strPointer2 << endl;
如果要獲取指針對象的字符串的首地址的值的話,需要讓cout
輸出符不認爲它是一個字符指針,這樣就不會產生重載操作了,這樣可以看到兩個地址是相同的
cout << (void*)strPointer1 << endl;
cout << (void*)strPointer2 << endl;