在上例中,程序完成了兩項(xiàng)工作:一是把pss指向的源字符復(fù)制到pds所指向的目標(biāo)字符中,二是判斷所復(fù)制的字符是否為`\0',若是則表明源字符串結(jié)束,不再循環(huán)。否則,pds和pss都加1,指向下一字符。在主函數(shù)中,以指針變量pa,pb為實(shí)參,分別取得確定值后調(diào)用cprstr函數(shù)。由于采用的指針變量pa和pss,pb和pds均指向同一字符串,因此在主函數(shù)和cprstr函數(shù)中均可使用這些字符串。也可以把cprstr函數(shù)簡化為以下形式:
cprstr(char *pss,char*pds)
{while ((*pds++=*pss++)!=`\0');}
即把指針的移動和賦值合并在一個語句中。 進(jìn)一步分析還可發(fā)現(xiàn)`\0'的ASCⅡ碼為0,對于while語句只看表達(dá)式的值為非0就循環(huán),為0則結(jié)束循環(huán),因此也可省去“!=`\0'”這一判斷部分,而寫為以下形式:
cprstr (char *pss,char *pds)
{while (*pdss++=*pss++);}
表達(dá)式的意義可解釋為,源字符向目標(biāo)字符賦值, 移動指針,若所賦值為非0則循環(huán),否則結(jié)束循環(huán)。這樣使程序更加簡潔。簡化后的程序如下所示。
cpystr(char *pss,char *pds){
while(*pds++=*pss++);
}
main(){
char *pa="CHINA",b[10],*pb;
pb=b;
cpystr(pa,pb);
printf("string a=%s\nstring b=%s\n",pa,pb);
}
使用字符串指針變量與字符數(shù)組的區(qū)別
用字符數(shù)組和字符指針變量都可實(shí)現(xiàn)字符串的存儲和運(yùn)算。 但是兩者是有區(qū)別的。在使用時應(yīng)注意以下幾個問題:
1. 字符串指針變量本身是一個變量,用于存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續(xù)的內(nèi)存空間中并以‘\0’作為串的結(jié)束。字符數(shù)組是由于若干個數(shù)組元素組成的,它可用來存放整個字符串。
2. 對字符數(shù)組作初始化賦值,必須采用外部類型或靜態(tài)類型,如: static char st[]={“C Language”};而對字符串指針變量則無此限制,如: char *ps="C Language";
3. 對字符串指針方式 char *ps="C Language";可以寫為: char *ps; ps="C Language";而對數(shù)組方式:
static char st[]={"C Language"};
不能寫為:
char st[20];st={"C Language"};
而只能對字符數(shù)組的各元素逐個賦值。
從以上幾點(diǎn)可以看出字符串指針變量與字符數(shù)組在使用時的區(qū)別,同時也可看出使用指針變量更加方便。前面說過,當(dāng)一個指針變量在未取得確定地址前使用是危險(xiǎn)的,容易引起錯誤。但是對指針變量直接賦值是可以的。因?yàn)镃系統(tǒng)對指針變量賦值時要給以確定的地址。因此,
char *ps="C Langage";
或者 char *ps;
ps="C Language";都是合法的。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |