C指针和数组声明
我目前正在通过“”学习C 在一些示例代码中,我对为什么某些数组必须用指针初始化感到有点困惑C指针和数组声明,c,pointers,C,Pointers,我目前正在通过“”学习C 在一些示例代码中,我对为什么某些数组必须用指针初始化感到有点困惑 int ages[] = {23, 43, 12, 89, 2}; char *names[] = { "Alan", "Frank", "Mary", "John", "Lisa" }; 在上面的示例中,为什么names[]数组在声明时需要指针?创建数组时,如何知道何时使用指针?因为数组的内容是char*。另一个例子有一个int。“Alan”是一个字符串,在C语言
int ages[] = {23, 43, 12, 89, 2};
char *names[] = {
"Alan", "Frank",
"Mary", "John", "Lisa"
};
在上面的示例中,为什么names[]数组在声明时需要指针?创建数组时,如何知道何时使用指针?因为数组的内容是
char*
。另一个例子有一个int
。“Alan”是一个字符串,在C语言中,您将字符串声明为char指针
在char*names[]
的情况下,您将声明一个字符串指针数组
C.g.“Alan”
中的字符串是内存中以\0值结尾的一系列字符,该值标记字符串的结尾
printf( "%s:%d", names[0], strlen(names[0]) );
那么,有了这个声明,你就做到了
names[0] -> "Alan\0"
names[1] -> "Frank\0"
...
然后可以使用名称[n]作为字符串的指针
printf( "%s:%d", names[0], strlen(names[0]) );
它为输出
“Alan:4”
提供了一个字符串文本,例如“Alan”
的类型为char[5]
,要指向字符串的开头,可以使用char*
<代码>“Alan”本身由以下部分组成:
{ 'A', 'L', 'A', 'N', '\0' }
如您所见,它由多个char
s组成。这个char*
指向字符串的开头,字母'A'
由于您需要这些字符串的数组,因此可以将
[]
添加到声明中,因此当您使用字符串文字时,它将变成:char*names[]
首选常量指针
const char *names[] = {
"Alan", "Frank",
"Mary", "John", "Lisa"
};
在声明中,name
是一个const char
指针数组,这意味着它包含5个到cstring的char*
。当你想使用一个指针时,你可以使用一个指针,就这么简单
例如:
const char *c = "Hello world";
因此,当您在数组中使用它们时,您将创建5个指向字符串文本的const char*
指针。不需要使用“指针数组”
const char *names[] = {
"Alan", "Frank",
"Mary", "John", "Lisa"
};
下面的方法也可以。它是一个由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]);
}
}
#包括
字符名称[][20]={
“艾伦”,“弗兰克”,
“玛丽”、“约翰”、“丽莎”
};
int main(int argc,char*argv[])
{
int-idx;
对于(idx=0;idx<5;idx++){
printf(“%s”\n”,名称[idx]);
}
}
在您的示例中,数组中对象的大小是“指向字符的指针”。字符串常量可用于初始化“指向字符的指针”或“字符数组”。“字符串文字(如“Alan”)的类型为char*
”—实际上,它的类型为char[length+1]
。