我的印象是他们是同一件事。然而,我认为他们在这里被区别对待。我感到困惑的部分看起来像这样。
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。 我对指针缺少什么?
答案 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];