C/C++程式設計筆記:C語言字元陣列初始化,有些賦值方式千萬注意

字元陣列的初始化,最容易理解的方式就是逐個字元賦給陣列中各元素。

charstr[10]={'I','','a','m','',‘h’,'a','p','p','y'};

即把10個字元分別賦給str[0]到str[9]10個元素

如果花括號中提供的字元個數大於陣列長度,則按語法錯誤處理;若小於陣列長度,則只將這些字元陣列中前面那些元素,其餘的元素自動定為空字元(即'\0')

如char str[10] = {'\0'}; //結果裡面元素全都為\0.其實這樣賦值只是把第1個元素賦值為\0,後面的都預設用\0填充,如果是char str[10]={'1'};

只有第一個為‘1’,後面都是\0。但千萬不要以為寫成char str[10];不賦值也可以。這樣寫裡面的內容是錯的。

這是細節,值得注意。

所以我們最好每次想寫char str[5]都寫成

char str[5]='\0';

這樣做最好。

int a[10]={4,5};

第一個賦值為4,第二個為5,後面的為0.如果直接int a[10]; 內容很亂。

規律:用某個值給陣列賦值,沒有被賦值的元素會自動呼叫預設的建構函式,如char預設為\0,int預設為0.等等.

在 c語言中,將字串作為字元陣列來處理。(c 中不是)

在實際應用中人們關心的是有效字串的長度而不是字元陣列的長度,例如,

定義一個字元陣列長度為100,而實際有效字元只有40個,為了測定字串的實際長度,C語言規定了一個“字串結束標誌”,以字元'\0’代表。如果有一個字串,其中第10個字元為'\0',則此字串的有效字元為9個。也就是說,在遇到第一個字元'\0'時,表示字串結束,由它前面的字元組成字串。

系統對字串常量也自動加一個'\0'作為結束符。例如"C Program”共有9個字元,但在記憶體中佔10個位元組,最後一個位元組'\0'是系統自動加上的。(透過 sizeof()函式可驗證)

了結束標誌'\0'後,字元陣列的長度就顯得不那麼重要了,在程式中往往依靠檢測'\0'的位置來判定字串是否結束,而不是根據陣列的長度來決定字串長度。當然,在定義字元陣列時應估計實際字串長度,保證陣列長度始終大於字串實際長度。(在實際字串定義中,常常並不指定陣列長度,如 char str[ ])

說明:'\n’代表 ASCII 碼為0的字元,從 ASCII碼錶中可以查到 ASCII 碼為0的字元不是一個可以顯示的字元,而是一個“空運算子”,即它什麼也不幹。用它來作為字串結束標誌不會產生附加的操作或增加有效字元,只起一個供辨別的標誌。

對C 語言處理字串的方法由以上的瞭解後,再對字元陣列初始化的方法補充一種方法——即可以用字串常量來初始化字元陣列:

注意sizeof與strlen的不同:

char a[40]={'0'};

printf("%d",sizeof(a));//開闢的陣列的總大小40*1

printf("%d",strlen(a));

輸出 40,1.

char str[ ]={"I am happy"}; 可以省略花括號,如下所示

char str[ ]="I am happy";

注意:上述這種字元陣列的整體賦值只能在字元陣列初始化時使用,不能用於字元陣列的賦值,字元陣列的賦值只能對其元素一一賦值,如:

char d[5];

d="hell";

錯誤。vs2010提示表示式d必須是可修改的左值。

這跟

int a[5]={1,2,3};

而不能

int a[5];

a={1,2,3}

陣列只能在初始化的時候一次性賦值,其他時候必須要一個一個賦值。

看來陣列名和指標是有區別的。

下面的賦值方法是錯誤的

char str[ ];

str="I am happy";

不是用單個字元作為初值,而是用一個字串(注意:字串的兩端是用雙引號“”而不是單引號‘’括起來的)作為初值。顯然,這種方法更直觀方便。(注意:陣列str的長度不是10,而是11,這點請務必記住,因為字串常量"I am happy"的最後由系統自動加上一個'\0')

因此,上面的初始化與下面的初始化等價

char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};必須要人為加上一個\0,否則strlen不正確。

而不與下面的等價

char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};//strlen錯誤,後面沒有\0

前者的長度是11,後者的長度是10.

說明:字元陣列並不要求它的最後一個字元為'\0',甚至可以不包含'\0',像下面這樣寫是完全合法的。

char str[5]={'C','h','i','n','a'};

可見,用兩種不同方法初始化字元陣列後得到的陣列長度是不同的。

對字元陣列只能對各個元素賦值,不能用以下方法對字元陣列賦值

char str[14];

str="I love China"; (但在字元陣列初始化時可以,即 charstr[14]="I love China";)

而對字元指標變數,採用下面方法賦值:

char* a;

a="I love China";

或者是 char* a="I love China"; 都可以

對字元指標變數賦初值(初始化):

char* a="I love China";

等價於:

char* a

a="I love China";

而對於字元陣列的初始化

char str[14]="I love China";

不能等價於:

char str[14];

str="I love China"; (這種不是初始化,而是賦值,而對陣列這樣賦值是不對的)

版權宣告:本文源自 網路, 於,由 楠木軒 整理釋出,共 2340 字。

轉載請註明: C/C++程式設計筆記:C語言字元陣列初始化,有些賦值方式千萬注意 - 楠木軒