C++字元陣列與字串
C/C++語言的特性:靈活;底層;為什麼呢?大概跟陣列和指標這兩個東西有很大的關係;
作為以C++入門的人來說;我覺得有必要去把這門語言搞清楚;當然了這與我的性格有關係;
所以呢,最近會花時間將C++中的一些特性或者之前沒有搞清楚的地方重新梳理一遍;主要面對的是基礎語法方面;
單純的就語法而言,C++說是最難的語言其實是一點都不為過的;
在使用C++寫程式的時候,尤其在處理指標陣列函式引數這些東西的時候,對於記憶體的控制很菜;
基本概念
字元陣列
陣列在C++中 是一種符合型別;為什麼是複合型別;就是因為陣列的定義需要別的內建型別來構建;
字元陣列在本質上來說和其他各種型別的陣列是沒有太大的區別的;就是程式為了儲存字元而在記憶體中開闢的一串連續的內空間;
字串
字串是在儲存在記憶體中的連續位元組中的一系列字元;
那麼由上面的定義中我們就很容易的可以看出字元陣列和字串這兩個概念的區別在哪裡了;字元陣列的概念側重於描述記憶體空間;而字串的概念側重於描述記憶體空間的內容——字串;
從本質上來說,字串是一種特殊的字元陣列,特殊在哪裡,後面的內容中會具體說明;
字元陣列在前面也說過,和其他的陣列沒有太大的區別;在這裡就不再詳細說明,本文章主要說明string的一些特性和處理方法;
在C++中,對於字串的處理有兩種方式:來自C語言的處理方式——C風格的字串,和C++98中新增的string類;
C型別的字串及處理方式
C型別的字串其實就是通過字元陣列的方式來處理字串的;這就是為什麼之前說的字串是一種特殊的字元陣列;
它與字元陣列不同的地方在於字串在記憶體中是以空字元'\0'(asii碼中的0)來作為結束標誌的,而普通的字元陣列我們知道是沒有結束標誌這個概念的;
空字元
空字元其實就是記憶體中被設定為0的位元組;//在C++中很多的字串處理函式都是以空字元'\0'來作為結束標誌的;
兩個宣告:
char c_ary1[7]={'h','e','l','l','o','w','\0'}//this is a string
char c_ary2[7]={'w','o','r','l','d','l','o'}//this is not a string
上面兩個宣告中,c_ary1是一個字串,而第二個c_ary2不是;
初始化
字串初始化的方式較多,使用初始化陣列的方式均可初始化字串,但是有一點需要注意的是在初始化字串的時候必須為結束標誌空字元留出儲存位置;
除此之外,還有較為方便的初始化方法:
char str1[20] = "hellow world!";
這種用引號初始化的字串隱式的包含了結束字元;所以"hellow world!"字串常量的實際儲存長度為14個位元組;
用引號括起來的字串稱為字串常量;
//在這裡切勿將概念混淆:
此處的意思是使用字串常量初始化字元陣列,只是使用了字串常量中的值,就比如使用數字常量1,2,3來初始化int變數一樣;初始化之後的字串陣列仍是可以改變其中的陣列值的;並不是將該陣列變成了常量陣列;
拼接字串常量
上述使用引號括起來的字串常量可以直接進行拼接操作;
char str1[20] = "hellow world!""nihao";
cout << str1;
結果:
sizeof()函式和strlen()函式
char str1[20] = "hellow world!""nihao";
cout << str1;
cout<<"The length of array is:"<<sizeof(str1);//陣列的長度
cout << "The actual length of string is:"<<strlen(str1);//字串的實際長度(包括空字元'\0');
執行結果:
string類簡介
string類位於std名稱空間中;
string類的優點在於:可以將字串的陣列性質隱藏起來;從而使得我們可以像操作變數那樣操作字串;
string類對於字元床的操作如下: