如果我写这个
char *array = "One good thing about music";
我实际上是在创建一个数组吗?我的意思是这样做跟这个有什么不同吗?
char array[] = {"One", "good", "thing", "about", "music"};
声明和初始化
char *array = "One good thing about music";
声明一个指向包括终止空字符在内的27个字符(只读)数组的指针array
。
声明和初始化:
char array[] = "One, good, thing, about, music";
声明一个包含31个字符的字符数组。
是的,数组的大小为31,因为它包括终止字符'\0'
。
在内存中排列,第一种方式如下:
+-------+ +------------------------------+ | 数组 | --> | "音乐的一个好处" | +-------+ +------------------------------+
第二种方式如下:
+------------------------------+ | "音乐的一个好处" | +------------------------------+
数组会衰变为指向数组第一个元素的指针。如果你有一个数组,比如
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)
由于加法是交换的,因此最后也可以表示为
*(3 + array)
这导致了有趣的语法
3[array]
array
用作指向该数组的指针吗? - yaylitzis&array
是指向数组的指针,而不是指向第一个元素的&array[0]
。 - Kerrek SBchar array[] = "..."
)。否则这将没有多大意义,两个定义将大相径庭。 - Some programmer dudechar *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 string[] = {'s','o','m', 'e', ' ', 's', 't','r','i','n','g', '\0'};
//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', ' ', /*etc*/ ' ', 'm', 'u', 's', 'i', 'c', '\0'};
但是它只提供给你只读内存。
关于char[]
和char *
之间的区别,请参见comp.lang.c FAQ 1.32。
array[0] = 'X'
),你会得到未定义的行为(通常是分段错误)。 - tom实际上,它与之前的内容是“相同”的。
char array[] = {'O', 'n', 'e', ..... 'i','c','\0');
每个字符都是一个独立的元素,另外还有一个\0
字符作为字符串终止符。
我引用了“相同”,因为char * array
和char array[]
之间存在一些差异。如果您想了解更多信息,请查看C:char指针和数组之间的区别
char *array [] = { ... }
。 - Some programmer dude