char pets1[12] = "nice cat.";
char *pets2 = "nice cat.";
字符串的数组形式(pets1[12])在计算机内存中被分配一个有若干个元素的数组。每个元素都被初始化为相应的字符。通常,被引用的字符串存储在可执行文件的数据段部分;当程序被加载到内存中时,字符串也被加载到内存中。被引用的字符串被成为位于静态存储区。但是在程序开始运行之后才为数组分配存储空间。这时候,会把被引用的字符串复制到数组中。此后,编译器会把数组名pets1看作是数组首元素的地址&pets1[0]的同义词。这里最重要的一点是,在数组形式中,pets1是地址常量。您不能改变pets1。可以使用pets1+1来标识数组里的下一个元素,但是不允许使用pets1++。
指针形式(*pets2)也在静态存储区为字符串预留若干个元素的空间。此外,一旦程序开始执行,还要为指针变量pets2另外预留一个存储位置,以在该指针变量中存储字符串的地址。这个变量初始化时指向字符串的第一个字符,但是它的值是可以改变的。
总之,数组初始化是从静态存储区把一个字符串复制给数组,而指针初始化只是复制字符串的地址。