由於之前一直使用string類型來操作字符串,這幾天突然看了幾個程序,發現對char[]和char*類型不甚了解,然后從網上查看了幾篇博客,在此進行以下總結。
博客如下:http://blog.csdn.net/liruxing1715/article/details/6715503
http://blog.csdn.net/yahohi/article/details/7427724
一、char*與char[]的區別
數據在內存中的存儲區域
1、棧:就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變量的存儲區。里面的變量通常是局部變量、函數參數等。
2、堆:就是那些由new或malloc分配的內存塊,在不適用時,要手動用delete或free來釋放內存區域。
3、 全局/靜態存儲區:全局變量和靜態變量被分配到同一塊內存中,他們共同占用同一塊內存區。
4、 常量存儲區:這是一塊比較特殊的存儲區,他們里面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 char *a = "abc"; 6 char b[3] = { 'a','b' }; 7 b[0] = 'b'; 8 a[0] = 'b'; 9 cout << a << " " << b ; 10 getchar(); 11 }
以上代碼在運行時時會在第8行處出錯,因為char*和char[]的內存分區是不同的。
上面代碼中的char*a = ”abc“的”abc“是常量所以被分配在常量存儲區,a為字符指針類型是存放在棧區可以被更改,而常量存儲區是不能更改的,是只讀區域,所以當你試圖去寫入數據的時候,會報錯。
而char b[3] = {‘a’,‘b’}的字符a和b是存放在棧區的所以可以進行寫操作。
二、string跟char*類型轉換
1、string轉換成char*類型
string s = ”abc“;
const char *k = s1.c_str();
const char *t = s1.data();
這兩個函數返回值只能是const的類型
2、char*轉換成string類型
char* p = ”abc“;
string s = p;
這個操作就是可以直接賦值即可
