因爲以前一直使用string類型來操做字符串,這幾天忽然看了幾個程序,發現對char[]和char*類型不甚瞭解,而後從網上查看了幾篇博客,在此進行如下總結。ios
博客以下:http://blog.csdn.net/liruxing1715/article/details/6715503函數
http://blog.csdn.net/yahohi/article/details/7427724spa
1、char*與char[]的區別.net
數據在內存中的存儲區域 指針
一、棧:就是那些由編譯器在須要的時候分配,在不須要的時候自動清楚的變量的存儲區。裏面的變量一般是局部變量、函數參數等。
二、堆:就是那些由new或malloc分配的內存塊,在不適用時,要手動用delete或free來釋放內存區域。
三、 全局/靜態存儲區:全局變量和靜態變量被分配到同一塊內存中,他們共同佔用同一塊內存區。
四、 常量存儲區:這是一塊比較特殊的存儲區,他們裏面存放的是常量,不容許修改(固然,你要經過非正當手段也能夠修改,並且方法不少) code
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[]的內存分區是不一樣的。blog
上面代碼中的char*a = 」abc「的」abc「是常量因此被分配在常量存儲區,a爲字符指針類型是存放在棧區能夠被更改,而常量存儲區是不能更改的,是隻讀區域,因此當你試圖去寫入數據的時候,會報錯。內存
而char b[3] = {‘a’,‘b’}的字符a和b是存放在棧區的因此能夠進行寫操做。字符串
2、string跟char*類型轉換get
一、string轉換成char*類型
string s = 」abc「;
const char *k = s1.c_str();
const char *t = s1.data();
這兩個函數返回值只能是const的類型
二、char*轉換成string類型
char* p = 」abc「;
string s = p;
這個操做就是能夠直接賦值便可