C指针和数组声明

时间:2011-11-08 06:46:35

标签: c pointers

我目前正在通过“Learning C the Hard Way

学习C语言

我在一些示例代码中有点困惑,为什么必须使用指针初始化某些数组。

 int ages[] = {23, 43, 12, 89, 2}; 
  char *names[] = {
      "Alan", "Frank",
      "Mary", "John", "Lisa"
  }; 

在上面的例子中,为什么名称[]数组在声明时需要指针?你怎么知道在创建数组时何时使用指针?

5 个答案:

答案 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数组”。