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


  由於之前一直使用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、 常量存儲區:這是一塊比較特殊的存儲區,他們里面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多) 

有了以上的了解在對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[]的內存分區是不同的。

上面代碼中的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;

這個操作就是可以直接賦值即可 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM