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