我的印象是他们是同一件事.然而,我认为他们在这里被区别对待.我感到困惑的部分看起来像这样.
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.我对指针缺少什么?
这条线:
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个字符的数组.