char型別和string型別(C ,C

2021-09-30 10:22:29 字數 3645 閱讀 8219

這一篇要講乙個非常重要的話題:char型別與string型別的區別。從字面上說,他們是有區別的

1. char是字元型別

2. string是字串型別

雖然一字之差,但其本質是很大的。

2. string是乙個模板型別,也就是乙個class(c++)。在c#中它屬於引用型別(reference type)。string的長度是無法明確取得的。也就是無法通過sizeof來取得,因為它不是乙個基礎型別,它本身並不固定長度,而取決於內部包含的字元。

說完了本質區別,我們再來看一下從使用者角度來看

1. char型別:用單引號,例如:『陳』,』a』

要表示多個字元怎麼辦?那麼就用char,也就是陣列

【注意】如果在c++中,將』陳』賦值給乙個char型別,而不是wchar_t型別,會有問題,因為漢字是兩個位元組的,char是乙個位元組的。

2.string型別:用雙引號,例如:」我是陳希章」

除此之外,還有一些很重要的區別

1. char型別雖然聽起來是字元型別,但其他它可以隱式地轉換為包括short, int,long等整數型別。為什麼這麼說呢?我們不是說了它要麼佔1個位元組,要麼佔2個位元組嗎?

下面來看乙個例子,如何對char轉換為short,以及如何從short轉換為char

這也就是我們經常說的,字元對應的編碼:大寫a編號為65,小寫a編號為97

相關知識:在excel中,可以通過char函式根據乙個數字返回字元,通過code函式返回某個字元對應的編碼,如下

=char(97)  會返回「a"

=char(98)  會返回「b"

=char(99)  會返回「c"

=char(100)  會返回「d"

以此類推。。。。。

反向返回

=code(「a")  會返回「97"

=code(「b")  會返回「98"

=code(「c")  會返回「99"

=code(「d")  會返回「100"

2.  char型別既然是乙個基礎型別,它有signed char和unsigned char的區分

你可能會問,乙個字元跟符號有什麼關係呢?

沒錯,字元是沒有關係。但你要知道,char型別可以用來表示整數的。既然是可以用來表示整數,就有正負之分了。例如,我們要表示乙個整數,它的取值範圍比較小,不會超過255.那麼此時,我們就可以直接用unsigned char,而不必用short(2個位元組),更沒有必要用int(4個位元組)了

但是,到了c#裡面,所有的char都是無符號的

1、byte   變數以無符號的   8   位(1   個位元組)數字的形式儲存,取值範圍為   0   到   255。  

byte   資料型別用於存放二進位制資料。  

注意       byte   資料型別可以轉換為   short、integer、long、single、double   或   decimal   資料型別,而不會出現   system.overflowexception   錯誤。  

2、char   變數以無符號的   16   位(2   個位元組)數字的形式儲存,取值範圍為   0   到   65535。每個數字代表乙個   unicode   字元。不能直接在   char   資料型別和數值型別之間進行轉換,但可以使用   ascw   和   chrw   函式來完成。

相關知識:sql server中類似整數型別的聯想

我又聯想到在sql server中幾個特殊的資料型別

bit取值:0,1

tinyint

取值:0~255。相當於c++中的unsigned char,或者c#中的byte

smallint

取值:-32768~32767。其實相當於c++中的short型別

int取值:正負20多億,也就是正負2的32次方

最後談一談,string這個型別到底是怎麼儲存資料的,它需要占用多少空間?

1. string中沒過字元都用2個位元組儲存

2. string的最後還有乙個特殊的字元,是不可見的,\0 。它也是佔兩個位元組

3. string的大小是不可以通過sizeof來獲得的。如果嘗試通過sizeof取得string的大小,會遇到編譯錯誤

上面的錯誤提示說,要用system.runtime裡面的乙個型別去做。不要這麼做,因為沒有用。請參考下面的**

using system;

using system.collections.generic;

using system.text;

string input = "你好,我是陳希章";

byte bytes = encoding.default.getbytes(input);

console.writeline(bytes.length);//返回15,每個漢字佔兩個位元組(7×2=14),標準的佔1個位元組

byte bytes2 = encoding.unicode.getbytes(input);

console.writeline(bytes2.length);//返回16,所有字元都用兩個位元組

byte bytes3 = encoding.ascii.getbytes(input);

console.writeline(bytes3.length);//返回8,所有字元都用乙個位元組(有點詭異)

console.read();}}

}也就是說,乙個字串具體占多大空間,還取決於字元的編碼。到了這裡,大家應該就有更好的認識了。最後說兩個與string 有關的技巧

1. c#中,string是不可變的。在動態構造字串的時候(例如:result=result+」test」 ),其實會產生乙個新的字串,原有的result還會保留,新建立的乙個的result是舊的result和「test」連起來的結果。所以,為了更好的使用資源,應該使用stringbuilder

2. string有沒有上限呢?理論上是受記憶體限制。但一般可以認為是2g(2的31次方)

另外,在使用char或者string的時候,不要忘記有一些字元是比較特殊的,也就是所謂的「轉義字元」,例如\n表示換行,\t表示tab鍵等

\b:回退:向後退一格

\f:換頁 

\n:換行,游標到下行行首

\r:回車,游標到本行行首 

\t:水平製表 

\v:垂直製表 

\\:反斜槓

\『:單引號

\":雙引號 

\?:問號

\ddd:三位八進位制 

\xhh:二位十六進製制 

\0:空字元(null),什麼都不做。換行只是換一行,不改變游標的橫座標;回車只是回到行首,不改變游標的縱座標。 

char型別和string型別的區別

也許有很多同學分不清這個char型別和string型別,區別到底在 一開始他們問我,差別在 我也不太說的清楚,貌似都是字串,貌似是字元,通過查閱資料,我對他們的區別有了進一步的了解。雖然一字之差,但是本質的區別很大。我們從c 與c 的角度來進行闡述一下。1.char是字元型別 屬於值型別 value...

string型別和char型別相互轉換

概念 string string可以被看成是以字元為元素的一種容器。具有一些成員函式比如begin end 迭代器可以根據他們進行定位,length 函式獲取長度。與char型別不同,string 不一定使用null 0 結束,不能將string直接賦值給char char char 是乙個指標,可...

將char型別轉換為string型別

將char型別轉換為string型別 string的建構函式中有此函式原型 string size t n,char c 因此我們可以直接使用此函式 string s 1,a 建立s並將1個a存入到s中 前面的數字代表多少個 擴充套件將char型別放入到vector容器中 第一種就是 vectorv...