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
的指针。 应该注意的是&array
与array
(或它的等价&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 * array
和char array[]
之间存在一些差异。 如果您想阅读更多内容,请查看C:char指针和数组之间的差异
它非常相似
char array[] = {'O', 'n', 'e', ' ', /*etc*/ ' ', 'm', 'u', 's', 'i', 'c', '\0'};
但是给你只读内存。
有关char[]
和char *
之间区别的讨论,请参阅comp.lang.c FAQ 1.32 。