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

jer*_*son 1 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);
}
Run Code Online (Sandbox Code Playgroud)

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

180*_*ION 7

字符串是一个字符数组.你在这里有一个字符指针数组.


Jer*_*emy 6

这条线:

char* player_name[25];
Run Code Online (Sandbox Code Playgroud)

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

假设指针在您的机器上是4个字节,则此行将具有分配25 x 4 = 100个字节的效果.

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

所以...执行此行时:

scanf("%s", player_name);
Run Code Online (Sandbox Code Playgroud)

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

最后:

foo = initFoo(player_name);
Run Code Online (Sandbox Code Playgroud)

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

正如其他人所说,将一行改为是正确的

char player_name[25];
Run Code Online (Sandbox Code Playgroud)

它声明了一个包含25个字符的数组.