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"};
4条答案
按热度按时间bd1hkmkf1#
声明和初始化
声明一个指针
array
,并使其指向一个27个字符的(只读)数组,包括终止空字符。声明和初始化
声明一个字符数组,包含31个字符。
是的,数组的大小是31,因为它包括终止字符
'\0'
。在内存中,它将是这样的第一个:
第二个是这样的:
数组衰减为指向数组第一个元素的指针。
那么当需要一个指针时使用普通的
array
,它和&array[0]
是一样的。这意味着,当你,例如,将数组作为参数传递给函数时,它将作为指针传递。
指针和数组 * 几乎 * 是可以互换的。例如,你不能使用
sizeof(pointer)
,因为它返回的是实际指针的大小,而不是它指向的内容。另外,当你使用&pointer
时,你会得到指针的地址,但是&array
返回一个指向数组的指针。应该注意的是,&array
与array
非常不同(或其等价物&array[0]
)。虽然&array
和&array[0]
指向相同的位置,但类型不同。使用上面的数组,&array
的类型为char (*)[31]
,而&array[0]
的类型为char *
。更多乐趣:正如很多人所知,在访问指针时可以使用数组索引。但是因为数组衰减为指针,所以可以对数组使用一些指针算法。
例如:
使用上面的代码,您可以使用以下任一方法访问第四个元素(
'b
'字符或
因为加法是commutative,所以最后一个也可以表示为
这就引出了有趣的语法
eeq64g8w2#
不,你是在创建一个数组,但有一个很大的区别:
数组是在内存的“只读”部分创建的,因此不能通过指针编辑值,而:
创建相同的只读常量字符串,并将其 * 复制 * 到堆栈数组。这就是原因:
在后一种情况下是有效的。
如果你写:
编译器应该会抱怨,因为你正在构造一个char数组(或char指针)的数组,并将其赋值给一个char数组。这些类型不匹配。要么写:
最后一个版本给了你一个字符串数组(字符数组),你实际上可以编辑……
uqzxnwby3#
不,事实上,它和
每个字符都是一个单独的元素,并有一个额外的
\0
字符作为字符串结束符。我引用了“相同”,因为
char * array
和char array[]
之间存在一些差异。如果您想了解更多信息,请查看C: differences between char pointer and arrayrjjhvcjd4#
它非常类似于
但给你只读存储器。
有关
char[]
和char *
之间的差异的讨论,请参见comp.lang.c FAQ 1.32。