2.字符數(shù)組和指針
我們可以使用指針符號(hào)建立字符串。
如:
const char *about[] = "about me!";
這個(gè)聲明和下面聲明的作用幾乎相同:
char about[] = "about me!"
那么,這兩種方式有什么不同呢?
數(shù)組形式在計(jì)算機(jī)中被分配一個(gè)有10個(gè)元素的數(shù)組。每個(gè)元素都被初始化為相應(yīng)的字符。最后那個(gè)字符為\0。
通常,被引用的字符串存儲(chǔ)在可執(zhí)行文件的數(shù)據(jù)段部分;
當(dāng)程序被加載到內(nèi)存中時(shí),字符串也被加載到內(nèi)存中。被引用的字符串被稱為位于靜態(tài)存儲(chǔ)區(qū)。
但是在程序開始運(yùn)行后才為數(shù)組分配存儲(chǔ)空間。這個(gè)時(shí)候,把被引用的字符串復(fù)制到數(shù)組中。
此后,編譯器會(huì)把數(shù)組名about看作是數(shù)組首元素地址&about[0]的同義詞。
但是,數(shù)組形式的about是個(gè)地址常量,您不能更改about,因?yàn)橹馕吨臄?shù)組存儲(chǔ)的位置(地址)。
可以用運(yùn)算符aoubt+1來標(biāo)識(shí)下一個(gè)元素,但是不能使用++about。
增量運(yùn)算符只能用在變量名前,不能用在常量名前。
指針形式*about也在靜態(tài)區(qū)預(yù)留10個(gè)元素的空間。
此外,一旦程序開始執(zhí)行,還需要為指針變量另外預(yù)留一個(gè)存儲(chǔ)位置。
這個(gè)變量初始化時(shí)指向字符串的第一個(gè)字符,但是它的值是可以改變的。
因此,可以對它使用增量運(yùn)算符。例如,++about將指向第二個(gè)字符b。
3.數(shù)組和指針的差別
char heart[] = "I love cuicui!";
char *head[] = "I love cuicui!"
主要的差別在于數(shù)組名heart是個(gè)常量,而指針head則是個(gè)變量。
首先,兩者都可以使用數(shù)組符號(hào)
for (i = 0; i < 6; i++)
{
putchar (heart[i]);
}
putchar ('\n');
for (i = 0; i < 6; i++)
{
putchar (head[i]);
}
putchar ('\n');
其次,兩者都可以使用指針加法
for (i = 0; i < 6; i++)
{
putchar (*(heart + i));
}
putchar ('\n');
for (i = 0; i < 6; i++)
{
putchar (*(hed + i));
}
putchar ('\n');
但是,只有指針可以使用增量運(yùn)算符
while (*(head) != '\0')
{
putchar (*(head++));
}
最后,不能使用以下語句
//第一種情況
heart = head; //非法,常量的值不能改變
//第二種情況
head[1] = 'k'; //非法,C的標(biāo)準(zhǔn)不應(yīng)該允許這樣做,但少量編譯器混淆了這個(gè)概念
為了防止第二種情況發(fā)生,建議的做法是在初始化一個(gè)指向字符串文字的指針時(shí)使用const修飾符:
const char * p1 = "Klingon";