char[]、char*、string的區別

char a[3]:編譯器會給數組分配3個單元,每個單元的數據類型爲字符

char *s:這是個指針變量,只佔四個字節,保存的是地址

char a[3] = “ab”;

//這種方法定義時,系統會自動從未初始化的元素開始,將之後的元素賦爲’\0’。

cout<<strlen(a)<<endl; //2

cout<<sizeof(a)<<endl;//3

a[0] = ‘m’;

cout<<a<<end; //mb

 

char a[3] = “a”;

cout<<strlen(a)<<endl; //1

cout<<sizeof(a)<<endl;//3

a[1] = ‘m’;

cout<<a<<end; //am

 

char b[5] = {‘a’,’b’,’c’,’d’,’\0’};

//這種方法或者 char c[] = {‘1’,’2’,’3’}定義時,系統不會自動在字符串的末尾添加字符串結束符即’\0’,用strlen函數將不能正確求出其長度,因爲strlen是通過\0來判斷字符串結束的;但sizeof()函數可以正確求出其所佔內存大小。因此需要人爲添加’\0’。這種方法char a[4]={‘a’,’b’,’c’}定義時,系統會自動從未初始化的元素開始,將之後的元素賦爲’\0’。

cout<<strlen(a)<<endl; //4

cout<<sizeof(a)<<endl;//5

cout<<b<<endl; //abcd

 

char a[];  // 錯誤定義

a[] = abc; //錯誤定義

 

char*e;

e = “xie”

cout<<strlen(e)<<endl;//3

cout<<sizeof(e)<<endl;//4

e[0] = m;  //不能如此訪問

//char*e 的”xie”是常量所以被分配在常量存儲區,e爲字符指針類型是存放在棧區可以被更改,而常量存取區是隻讀區域,不可以被更改。char a[3] = “ab”的字符a和b是存放在棧區的所以可以進行寫操作。

 

 

string s;

s = “abc”;

s[0] = ‘m’;

cout<<s<<endl;//mbc

cout<<s.size()<<endl;//3

C中是沒有string類型的數據的,C中的字符串類型是用char[]和char*來定義的;

在C中的<string.h>頭文件裏聲明的函數原型都是針對char數組進行操作的,比如strcmp,strcpy,strcat等。

C++中string表示一種特殊的類,和vector、list等一樣是標準庫類型,支持長度可變的字符串,提供各種有用的操作,其中內存管理由系統處理。

String類型的字符串可以直接使用==來比較,但char數組的字符串需要使用strcmp來進行比較。

 

參考鏈接:

https://blog.csdn.net/qq330214001/article/details/88372063

https://www.cnblogs.com/X-Do-Better/p/8628492.html

https://www.linuxidc.com/Linux/2012-09/70818.htm

https://blog.csdn.net/kidults/article/details/80747578(相互轉換可參考該鏈接)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章