字符串与C中的char指针数组有何不同?

时间:2009-04-08 01:23:01

标签: c pointers

我的印象是他们是同一件事。然而,我认为他们在这里被区别对待。我感到困惑的部分看起来像这样。

Foo* initFoo(char* name);

int main
{
  Foo* foo;
  char* player_name[25];
  scanf("%s", player_name);
  foo = initFoo(player_name);
}

Foo* initFoo(char* name)
{
  printf("\n%s", name);
}

字符串打印得很好。但是,我得到一个编译器警告说:从不兼容的指针类型传递'initFoo'的参数1。 我对指针缺少什么?

4 个答案:

答案 0 :(得分:7)

字符串是一个字符数组。你在这里有一个指向字符的数组。

答案 1 :(得分:6)

该行:

char* player_name[25];

为char分配一个25元素的指针数组。指向char的指针通常被认为是一个字符串,因此该声明可以解释为字符串数组,但用于存储这些字符串的内存尚不存在。您必须单独分配这些字符串。

假设您的计算机上的指针是4个字节,则此行将分配25 x 4 = 100个字节。

在C中,当您使用不带下标的数组名称时,它会“分解”为指向数组第一个元素的指针。

所以...执行此行时:

scanf("%s", player_name);

player_name指向100个字节的内存,足够容纳100个可读入的字符(99个字符加上一个终止的NUL字节)。编译器不会保护您不要将这些字符存储在分配给25个指针的内存中。

最后:

foo = initFoo(player_name);

将数组的起始地址传递给函数initFoo()。编译器知道这可能是错误的,因为initFoo()应该指向chars,而不是指向char指针数组的指针,但是除了警告之外,它还允许你这样做。 initFoo()中的printf()语句将该指针重新解释为char指针,并获得正确的结果!

正如其他人所说,将一行更改为

是正确的
char player_name[25];

声明一个包含25个字符的数组。

答案 2 :(得分:4)

char* player_name[25];  /* means an array of character pointers. */
char  player_name[25];  /* will get rid of the warning */

答案 3 :(得分:0)

要将其更改为:

char player_name[25];