char *数组和char数组[]

时间:2013-12-03 09:21:18

标签: c arrays pointers char

如果我写这个

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

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

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

4 个答案:

答案 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 * arraychar 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