我目前正在通过“Learning C the Hard Way”
学习C语言我在一些示例代码中有点困惑,为什么必须使用指针初始化某些数组。
int ages[] = {23, 43, 12, 89, 2};
char *names[] = {
"Alan", "Frank",
"Mary", "John", "Lisa"
};
在上面的例子中,为什么名称[]数组在声明时需要指针?你怎么知道在创建数组时何时使用指针?
答案 0 :(得分:5)
"Alan"
等字符串文字的类型为char[5]
,并指向您使用char *
的字符串的开头。 "Alan"
本身由以下内容组成:
{ 'A', 'L', 'A', 'N', '\0' }
正如您所看到的,它由多个char
组成。此char *
指向到字符串的开头,即'A'
字母。
由于您需要这些字符串的数组,然后将[]
添加到您的声明中,因此它变为:char *names[]
。
答案 1 :(得分:3)
使用字符串文字时首选const指针。
const char *names[] = {
"Alan", "Frank",
"Mary", "John", "Lisa"
};
在声明中,name
是一个const char
指针数组,这意味着它对cstrings保持5 char*
。当你想使用指针时,你可以使用一个简单的指针。
示例:
const char *c = "Hello world";
因此,当您在数组中使用它们时,您将创建指向字符串文字的5个const char*
指针。
答案 2 :(得分:2)
因为数组的内容是char*
。另一个示例有int
。 “Alan”是一个字符串,在C语言中,您将字符串声明为char pointers
。
答案 3 :(得分:2)
在char *names[]
的情况下,您声明了一个字符串指针数组。
C中的字符串,例如"Alan"
是内存中的一系列字符,以标记字符串结尾的\ 0值结束
所以声明你正在做这个
names[0] -> "Alan\0"
names[1] -> "Frank\0"
...
然后你可以使用names [n]作为指向字符串的指针
printf( "%s:%d", names[0], strlen(names[0]) );
,它提供输出"Alan:4"
答案 4 :(得分:2)
不需要使用“指针数组”。
以下内容也适用。它是一个20字节字符数组的数组。编译器只需要知道数组中事物的大小,而不是数组的长度。你最终得到的是一个包含5个20个字节元素的数组,每个元素都有一个名称。
#include <stdio.h>
char names[][20] = {
"Alan", "Frank",
"Mary", "John", "Lisa"
};
int main(int argc, char *argv[])
{
int idx;
for (idx = 0; idx < 5; idx++) {
printf("'%s'\n", names[idx]);
}
}
在您的示例中,数组中的事物的大小是“指向char的指针”。字符串常量可用于初始化“指向char的指针”或“char数组”。