在結(jié)構(gòu)中一般使用字符數(shù)組來(lái)存儲(chǔ)字符串,那么是否可以用指向字符的指針代替字符數(shù)組?
看如下聲明:
#define LEN 20
Struct names{
Char first[LEN];
Char last[LEN];
};
?
Struct pnames{
Char * first;
Char * last;
};
答案是可以這樣聲明,但是可能會(huì)遇到麻煩,你得理解其含義.考慮以下的代碼:
Struct names veep={“Talia”, “Summers”};
Struct pnames treas={“Brad”, “Fallingjaw”};
Printf(“%s and %s\n”,veep.first,treas.first);
這是一段正確的代碼,也能正常運(yùn)行,但是請(qǐng)思考下字符串存儲(chǔ)在哪里?對(duì)于
Struct names
變量
veep
來(lái)說(shuō),字符串存儲(chǔ)在結(jié)構(gòu)內(nèi)部;這個(gè)結(jié)構(gòu)共分配了
40
字節(jié)來(lái)存放兩個(gè)字符串.然而,對(duì)于
Struct pnames
變量
treas
來(lái)說(shuō),字符串存儲(chǔ)在編譯器存儲(chǔ)字符串常量的任何地方.這個(gè)結(jié)構(gòu)存放的只是兩個(gè)地址而已,在系統(tǒng)中它總共占用
8
個(gè)字節(jié).
Struct pnames
結(jié)構(gòu)不為字符串分配任何存儲(chǔ)空間.它只適用于在另外的地方已經(jīng)為字符串分配了空間.簡(jiǎn)單的說(shuō),
Struct pnames
結(jié)構(gòu)中的指針應(yīng)該只用來(lái)管理那些已經(jīng)創(chuàng)建的而且在程序其他地方已經(jīng)分配過(guò)空間的字符串.
再來(lái)看看這個(gè)限制條件在什么情況下升級(jí)為問(wèn)題:
Struct names accountant;
Struct pnames attorney;
Puts(“Enter the last name of your accountant:”);
Scanf(“%s”,accountant.last);
Puts(“Enter the last name of your attorney”);
Scanf(“%s”,attorney.last);
語(yǔ)法方面來(lái)說(shuō),這段代碼沒(méi)有問(wèn)題,但是考慮下把輸入存儲(chǔ)到哪里了?對(duì)會(huì)計(jì)師來(lái)說(shuō),他的名字存儲(chǔ)在
accountant
變量的最后一個(gè)成員中;這個(gè)結(jié)構(gòu)有一個(gè)用來(lái)存放字符串的數(shù)組.對(duì)律師來(lái)說(shuō),
scanf()
把字符串放到由
attorney.last
給出的地址中.因?yàn)檫@是個(gè)沒(méi)有初始化的變量,所有該地址可能是任何值,程序就可以把名字放在任何地方.
所以,我們?nèi)绻枰粋€(gè)結(jié)構(gòu)來(lái)存儲(chǔ)字符串,請(qǐng)使用字符數(shù)組成員.存儲(chǔ)字符指針有它的用處,但也有被嚴(yán)重誤用的可能.
?
?
?
posted on 2006-11-10 16:15
matthew 閱讀(488)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
閱讀筆記