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语言

我目前正在通过“”学习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]