char * array和char array

如果我写这个

char *array = "One good thing about music"; 

我实际创建一个数组? 我的意思是这样的一样吗?

 char array[] = {"One", "good", "thing", "about", "music"}; 

声明和初始化

 char *array = "One good thing about music"; 

声明一个指针array ,使其指向一个31个字符的常量数组。

声明和初始化

 char array[] = "One, good, thing, about, music"; 

声明一个包含31个字符的字符数组。

是的,数组的大小是31,因为它包含终止'\0'字符。


在内存中布局,第一个就是这样的:

 + ------- + + ------------------------------ +
 | 数组|  - > |  “关于音乐的一件好事”|
 + ------- + + ------------------------------ +

对于第二个是这样的:

 + ------------------------------ +
 |  “关于音乐的一件好事”|
 + ------------------------------ +

数组衰减到指向数组第一个元素的指针。 如果你有像这样的数组

 char array[] = "One, good, thing, about, music"; 

然后在预期指针时使用plain array ,它与&array[0]

这意味着,例如,当您将数组作为参数传递给函数时,它将作为指针传递。

指针和数组几乎可以互换。 例如,您不能使用sizeof(pointer)因为它返回实际指针的大小而不是它指向的大小。 此外,当你执行eg &pointer你得到了&pointer的地址,但是&array返回一个指向&array的指针。 应该注意的是&arrayarray (或它的等价&array[0]非常不同。 虽然&array&array[0]指向同一位置,但类型不同。 使用上面的arrat, &array的类型为char (*)[31] ,而&array[0]的类型为char *


更多乐趣:众所周知,在访问指针时可以使用数组索引。 但是因为数组衰减到指针,所以可以对数组使用一些指针算法。

例如:

 char array[] = "Foobar"; /* Declare an array of 7 characters */ 

使用上述内容,您可以使用其中任何一个访问第四个元素( 'b ‘字符)

 array[3] 

要么

 *(array + 3) 

并且因为加法是可交换的 ,所以最后也可以表示为

 *(3 + array) 

这导致了有趣的语法

 3[array] 

不,你正在创建一个数组,但是有一个很大的区别:

 char *string = "Some CONSTANT string"; printf("%c\n", string[1]);//prints o string[1] = 'v';//INVALID!! 

该数组是在内存的只读部分中创建的,因此您无法通过指针编辑该值,而:

 char string[] = "Some string"; 

创建相同的只读常量字符串,并将其复制到堆栈数组。 这就是为什么:

 string[1] = 'v'; 

在后一种情况下有效。
如果你写:

 char string[] = {"some", " string"}; 

编译器应该抱怨,因为你正在构造一个char数组(或char指针)数组,并将它分配给一个chars数组。 那些类型不匹配。 写道:

 char string[] = {'s','o','m', 'e', ' ', 's', 't','r','i','n','g', '\o'}; //this is a bit silly, because it's the same as char string[] = "some string"; //or char *string[] = {"some", " string"};//array of pointers to CONSTANT strings //or char string[][10] = {"some", " string"}; 

最后一个版本为您提供了一个实际可以编辑的字符串数组(字符数组)…

不,实际上它与“相同”

 char array[] = {'O', 'n', 'e', ..... 'i','c','\0'); 

每个字符都是一个单独的元素,附加的\0字符作为字符串终止符。

我引用“相同”,因为char * arraychar array[]之间存在一些差异。 如果您想阅读更多内容,请查看C:char指针和数组之间的差异

它非常相似

 char array[] = {'O', 'n', 'e', ' ', /*etc*/ ' ', 'm', 'u', 's', 'i', 'c', '\0'}; 

但是给你只读内存。

有关char[]char *之间区别的讨论,请参阅comp.lang.c FAQ 1.32 。