如果我写这个
char *array = "One good thing about music";
我实际创建了一个数组?我的意思是这样的吗?
char array[] = {"One", "good", "thing", "about", "music"};
答案 0 :(得分:34)
声明和初始化
char *array = "One good thing about music";
声明一个指针array
并使其指向一个包含31个字符的常量数组。
声明和初始化
char array[] = "One, good, thing, about, music";
声明一个包含31个字符的字符数组。
是的,数组的大小是31,因为它包含终止'\0'
字符。
在内存中,第一个就是这样的:
+-------+ +------------------------------+ | array | --> | "One good thing about music" | +-------+ +------------------------------+
第二次就像这样:
+------------------------------+ | "One good thing about music" | +------------------------------+
数组衰减到指向数组第一个元素的指针。如果你有像
这样的数组char array[] = "One, good, thing, about, music";
然后在预期指针时使用普通array
,它与&array[0]
相同。
这意味着当你例如将数组作为参数传递给函数时,它将作为指针传递。
指针和数组几乎可互换。例如,您不能使用sizeof(pointer)
因为它返回实际指针的大小而不是它指向的大小。当你这样做时&pointer
获取指针的地址,但&array
返回指向数组的指针。应该注意的是,&array
非常与array
(或其等价的&array[0]
)不同。虽然&array
和&array[0]
都指向同一位置,但类型却不同。使用上面的算法,&array
的类型为char (*)[31]
,而&array[0]
的类型为char *
。
更多乐趣:众所周知,访问指针时可以使用数组索引。但是因为数组衰减到指针,所以可以对数组使用一些指针算法。
例如:
char array[] = "Foobar"; /* Declare an array of 7 characters */
通过上述内容,您可以使用
访问第四个元素('b
'字符)
array[3]
或
*(array + 3)
因为加法是commutative,所以最后也可以表示为
*(3 + array)
这导致了有趣的语法
3[array]
答案 1 :(得分:8)
不,你正在创建一个数组,但是有很大的不同:
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"};
最后一个版本为您提供了一个字符串数组(字符数组),您实际上可以编辑...
答案 2 :(得分:2)
没有。实际上它与
“相同”char array[] = {'O', 'n', 'e', ..... 'i','c','\0');
每个字符都是一个单独的元素,并附加\0
个字符作为字符串终止符。
我引用“相同”,因为char * array
和char array[]
之间存在一些差异。
如果您想了解更多信息,请查看C: differences between char pointer and array
答案 3 :(得分:2)
与
非常相似char array[] = {'O', 'n', 'e', ' ', /*etc*/ ' ', 'm', 'u', 's', 'i', 'c', '\0'};
但是给你只读内存。
有关char[]
和char *
之间差异的讨论,请参阅comp.lang.c FAQ 1.32。