(1)char arr[10]="hi";
初始化字串陣列時,編譯器自動將字串最後乙個字元後面加上'/0',以表示字串的結束。
如果陣列的大小大於字串的長度+1,那麼把字串結束後面的元素也都初始化為'/0';
看這段程式:
定義乙個大小為12的字串陣列
char str1[12]="jiajia";
讓乙個char型的指標指向這個陣列
char *p1=str1;
輸出這個字串
printf("%s/n/n",str1);
利用指標輸出這個字串陣列中每個元素的字元、字元ascii值、字元儲存位址
for(int i=0;i<12;i++)
可以看出,陣列元素的後幾位都被初始化成了'/0';使用printf列印字串陣列時,程式遇到第乙個'/0'就結束對字串的讀取。
如果陣列的大小小於字串的長度+1,程式在執行時可能要出現問題,所以應當確保陣列的大小要大於字串長度的大小+1;
這段程式的字串長度+1小於陣列的大小:
char str2[12]="hello jiajia";
char *p2=str2;
printf("/n/n/n%s/n/n",str2);
for(int i=0;i<28;i++)
使用printf列印字串,程式需要找到'/0'才能結束讀取,結果找遍整個陣列沒有找到,只有繼續順著位址尋找,一直找到某個位址上的assii是0的,字串才讀取完畢。所以本段程式在讀取完"hello jiajia"之後,後面可能還會有幾個隨機的字元,就是因為字串終止於'/0'。
(2)char arr="hello world!";
這種初始化方法不用擔心陣列大小過小的情況,陣列的大小由編譯器決定。
(3)char arr=;
同第二種方法結果相同,但顯然要麻煩許多。另外,' '代表空格,ascii值是32,'/0'代表字串結束,ascii值是0;
(4)char *p="hello world";
使用陣列的方式初始化。同陣列不同之處在於,p是乙個變數,可以做遞增、遞減運算,而arr是陣列的首位址,是乙個位址常量,不能做遞增、遞減運算。
char *name="liujiajia";
name[0]='l';
printf("/n%s/n",name);
name[0]='l';這句**在最新的c99標準中會引發程式異常。需要注意。
char *string="c programe";
char *string2;
string2=string; //將指標string的值賦給string2
printf("/nstring=%s,&string=%p,string=%p/n",string,&string,string);
printf("/nstring=%s,&string=%p,string=%p/n",string2,&string2,string2);
上面這段程式最後顯示,指標string所指向的位址和指標string2所指向的位址相同,這就說明它們指向的是記憶體裡面同乙個字串,也就是說字串本身並沒有複製,而是產生了乙個指向同乙個字串的指標。這樣程式的效率會更加的高。如果需要複製字串可以使用 strcpy() 或 strncpy()。
原文:http://www.cnblogs.com/inspurhaitian/archive/2008/09/05/1285207.html
字串初始化
在c語言程式設計中,當我們宣告乙個字串陣列的時候,常常需要把它初始化為空串。總結起來有以下三種方式 1 char str 10 2 char str 10 3 char str 10 str 0 0 第 1 2 種方式是將str陣列的所有元素都初始化為 0 而第 3 種方式是只將str陣列的第乙個元...
字串初始化
在 裡,經常會用字串進行初始化操作。比如 void func void 對於上面2條初始化語句,它們的區別是什麼呢?1,首先,hello world 是乙個字串常量,存放在靜態常量區。2,str1是乙個字元陣列,分配在棧上,儲存空間由 hello world 的長度 含 0 決定,存放的內容由 he...
字串初始化
字串初始化使用字串初始化操作符即百分號 標記轉化說明符的開始。在 左邊為格式化字串,右邊為被格式化的值。format hello,s.s enough?values world cold print format values hello,world.cold enough?格式化字串的 s部分為轉...