字符串?dāng)?shù)組初始化:
(1)char arr[10]="HI";
初始化字符串?dāng)?shù)組時,編譯器自動將字符串最后一個字符后面加上'\0',以表示字符串的結(jié)束。
如果數(shù)組的大小大于字符串的長度+1,那么把字符串結(jié)束后面的元素也都初始化為'\0';
看這段程序:
定義一個大小為12的字符串?dāng)?shù)組
char str1[12]="jiajia";
讓一個char型的指針指向這個數(shù)組
char *p1=str1;
輸出這個字符串
printf("%s\n\n",str1);
利用指針輸出這個字符串?dāng)?shù)組中每個元素的字符、字符ascii值、字符存儲地址
for(int i=0;i<12;i++)
{
printf("%c:%d:%p\n",*p1,*p1,p1);
p1++;
}
可以看出,數(shù)組元素的后幾位都被初始化成了'\0';使用printf打印字符串?dāng)?shù)組時,程序遇到第一個'\0'就結(jié)束對字符串的讀取。
如果數(shù)組的大小小于字符串的長度+1,程序在運(yùn)行時可能要出現(xiàn)問題,所以應(yīng)當(dāng)確保數(shù)組的大小要大于字符串長度的大小+1;
這段程序的字符串長度+1小于數(shù)組的大小:
char str2[12]="hello jiajia";
char *p2=str2;
printf("\n\n\n%s\n\n",str2);
for(int i=0;i<28;i++)
{
printf("%c:%d:%p\n",*p2,*p2,p2);
p2++;
}
使用printf打印字符串,程序需要找到'\0'才能結(jié)束讀取,結(jié)果找遍整個數(shù)組沒有找到,只有繼續(xù)順著地址尋找,一直找到某個地址上的assii是0的,字符串才讀取完畢。所以本段程序在讀取完"hello jiajia"之后,后面可能還會有幾個隨機(jī)的字符,就是因?yàn)樽址K止于'\0'。
(2)char arr[]="Hello World!";
這種初始化方法不用擔(dān)心數(shù)組大小過小的情況,數(shù)組的大小由編譯器決定。
(3)char arr[]={'H','e','e','l','o',' ','W','o','r','l','d','\0'};
同第二種方法結(jié)果相同,但顯然要麻煩許多。另外,' '代表空格,ascii值是32,'\0'代表字符串結(jié)束,ascii值是0;
(4)char *p="Hello World";
使用數(shù)組的方式初始化。同數(shù)組不同之處在于,p是一個變量,可以做遞增、遞減運(yùn)算,而arr是數(shù)組的首地址,是一個地址常量,不能做遞增、遞減運(yùn)算。
char *name="liujiajia";
name[0]='L';
printf("\n%s\n",name);
name[0]='L';這句代碼在最新的c99標(biāo)準(zhǔn)中會引發(fā)程序異常。需要注意。
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所指向的地址相同,這就說明它們指向的是內(nèi)存里面同一個字符串,也就是說字符串本身并沒有復(fù)制,而是產(chǎn)生了一個指向同一個字符串的指針。這樣程序的效率會更加的高。如果需要復(fù)制字符串可以使用 strcpy() 或 strncpy()。