0.char* const cp 和 const char* p 的區別
char * const cp : 定義一個指向字符的指針常數,即const指針
其實const 放在cp前證明cp是一個const,cp是不允許改變的
const char* p : 定義一個指向字符常數的指針
同理,const 是c描述char的,char是const,所以指針可變
char const* p : 等同於const char* p
const char **p是一個指向指針的指針,那個指針又指向一個字符串常量。
char ** p也是一個指向指針的指針,那個指針又指向一個字符串變量。
1. const char* 和string 轉換
(1) const char*轉換為 string,直接賦值即可。
EX: const char* tmp = "tsinghua".
string s = tmp;
(2) string轉換為const char*,利用c_str()
EX: string s = "tsinghua";
const char*tmp = s.c_str();
2. char*和const char*之間的轉換
(1) const char*轉化為char*,利用const_cast<char*>
EX: const char* tmp = "tsinghua";
char* p = const_cast<char*>(tmp);
(2) char*轉化為const char*,直接賦值即可。
char* p = "tsinghua".
const char* tmp = p;
3. char*和string之間的轉換
有了1和2的基礎,char*和string轉化就很簡單了。
(1)char*轉化為string,直接賦值即可。
EX: char* p = "tsinghua".
string str = p;
(2)string轉化為char*,走兩步,先是string->const char*,然后是const char*->char*
EX: string str = "tsinghua";
char* p = const_cast<char*>(str.c_str()):
String類是不可變(final)的,對String類的任何改變,都是返回一個新的String類對象.這樣的話把String類的引用傳遞給一個方法,該方法對String的任何改變,對原引用指向的對象沒有任何影響,這一點和基本數據類型相似. 1 2 3 4 Strings1,s2; s1="abc"; s2=s1; s2="def"; //這樣操作之后s1是"abc",s2是"def". 1 2 3 4 5 6 stringa="hello,world!"; stringb="hello,world!"; stringc="hello!"; stringa="hello,world!"; stringb="hello,world!"; stringc="hello!"; a 和 b 是不是指向同一個地址呢,這個問題在各論壇都是談論很激烈,其實很簡單,跟下這些字符串的內存地址就好了 1 stringa="hello,world!"; 1 2 00000042moveax,dwordptrds:[02A62208h] 00000048movdwordptr[ebp-44h],eax 1 stringb="hello,world!"; 1 2 0000004bmoveax,dwordptrds:[02A62208h] 00000051movdwordptr[ebp-48h],eax 1 stringc="hello!"; 1 2 00000054moveax,dwordptrds:[02A756F8h] 0000005amovdwordptr[ebp-4Ch],eax a的地址指向02A62208h,b的地址也是02A62208h,這說明了什么,創建b的時候.net機制肯定是先去查找內存中是否有這個字符串的內存地址,如果有則指向,沒有才創建[1]
