char * 和char[]的區別以及怎樣與string類型進行轉換

  因爲以前一直使用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

有了以上的瞭解在對char*和char[]進行分析。
 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;

這個操做就是能夠直接賦值便可 

相關文章
相關標籤/搜索