字串在記憶體中的儲存 C語言高階

2021-09-07 10:44:37 字數 2073 閱讀 8724

字串是以ascii字元nul結尾的字串行。

ascii字元nul表示為\0.字串通常儲存在陣列或者從堆上分配的記憶體中。只是,並不是全部的字元陣列都是字串,字元陣列可能沒有nul字元。

字元陣列也用來表示布林值等小的整數單元,以節省記憶體空間。

c中有兩種型別的字串:

單位元組字串

由char資料型別組成的序列

寬字串

由wchar_t資料型別組成的序列

wchar_t資料型別用來表示寬字元,要麼是16位寬。要麼是32位寬。這兩種字串都以nul結尾。能夠在string.h中找到單位元組字串函式。而在wchar.h中找到寬字串函式。寬字元主要用於非拉丁字符集,對於支援外語的應用程式非常實用,

字串的長度是字串中除了nul字元外的字元數。為字串分配記憶體的時候,要記住為全部的字元加上nul字元分配足夠的空間。

null和nul不一樣。null用來表示特殊的指標,通常定義為((void*)0)。而nul是乙個char,定義為\0,兩者不能混用!

字元常量是單引號引起來的字串行。

字元常量通常由乙個字元組成。也能夠包括多個字元,比方轉義字元。

在c中,它們的型別是int,例如以下所看到的:

printf("%d\n",sizeof(char));

printf("%d\n",sizeof('a'));

//output

//1//4

宣告字串的方法有三種:字面量,字元陣列。和字元指標。

字串字面量是用雙引號引起來的字串行,經常使用來進行初始化,他們位於字串字面量池中。這和單引號引起來的字元不一樣!
以下是乙個字元陣列的樣例:

char header[32];

以下是字元指標:

char *header;
定義字元量一般會將其分配到字面量池中。這個記憶體區域儲存了組成字串的字串行。

多次會用到同乙個字面量時,字面量池一般會僅僅有乙個副本。這樣能夠降低應用程式占用的記憶體。

通常覺得字面量是不可變的,因此僅僅有乙份副本不會有什麼問題。

字串字面量一般分配在僅僅讀區域中,所以是不可變的。字串字面量在**使用。或者他是全域性,靜態或者區域性都無所謂,從這個角度講。字串字面量不存在作用域的概念。

在大部分編譯器中。我們將字串字面量看做常量。無法改動字串。

可是gcc編譯器容許字串字面量能夠改動。

char *header = "sound";

*header = 'l';

printf("%s\n",header);

//output

//lound

這樣就會改變字串,不是我們預期的結果。因此應該避免這樣做。像以下這樣把變數宣告為常量能夠解決一部分問題。不論什麼改動都會造成編譯時錯誤:

const char *header = "sound";
初始化字串採用的方法取決於變數是被宣告為字元陣列還是字元指標,字串所用的記憶體要麼是指標指向的一塊記憶體。我們都能夠用字串字面量或者一些列字元初始化字串,或者從別的地方(標準輸入)得到字元。

我們能夠用初始化操作符初始化char陣列。在下例中。header陣列被初始化為字串字面量中所包括的字元:

char header = "media player";

字元量"media player"的長度為12,表示這個字面量須要13個位元組,我們就要為陣列分配13個位元組來持有字串。初始化操作會把這些字元拷貝到陣列中,以nul結尾。

我們也能夠用strcpy函式來初始化陣列。

用動態記憶體分配來初始化char指標。

char *header;

char *header = (char*)malloc(strlen("media player")+1);

注意不要用sizeof操作符,而要用strlen函式來確定已有字串的長度,sizeo操作符會返回陣列和指標的長度,而不是字串的長度。

C語言 資料在記憶體中的儲存

字元型資料 1.字元與字元 把字元的相對應的ascii碼 整數,對映關係見ascii碼表 放到儲存碼單元中,而這些ascii 值在計算機中同樣以二進位制補碼的形式存放的。2.字元變數 字元型資料的儲存空間和值的範圍 32位操作平台 型別位元組數 取值範圍 signed char 有符號字元數 1 2...

資料在記憶體中的儲存c語言

基本內建型別 char 字元資料型別 short 短整型 int 整形 long 長整型 long long 更長的整形 float 單精度浮點數 double 雙精度浮點數使用這個型別開闢的記憶體空間大小 大小決定了適用範圍 如何看待記憶體空間的視角。在32位平台下,任何指標型別都只佔4個位元組。...

C語言 資料在記憶體中的儲存

得從整形在記憶體中的儲存說起 計算機中的有符號數有三種表示方法,即原碼 反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示 正 用1表示 負 而數值位三種表示方法各不相同。原碼直接將二進位制按照正負數的形式翻譯成二進位制就可以。反碼將原碼的符號位不變,其他位依次按位取反就可以得到了...