字符串与C中的char指针数组有什么不同?
问题描述:
我的印象是他们是同一件事。但是,它看起来像我在这里一样对待他们。我感到困惑的部分是这样的。字符串与C中的char指针数组有什么不同?
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);
}
字符串打印出来很好。但是,我得到一个编译器警告,说:从不兼容的指针类型传递参数1'initFoo'。 我对指针有什么想法?
答
字符串是一个字符数组。你在这里有一个指向字符的指针数组。
答
char* player_name[25]; /* means an array of character pointers. */
char player_name[25]; /* will get rid of the warning */
答
为了修正它更改为:
char player_name[25];
答
线:
char* player_name[25];
分配指针炭的25元件阵列。一个char指针通常被认为是一个字符串,所以这个声明可以被解释为一个字符串数组,但是用于存储这些字符串的内存还不存在。你将不得不分别分配这些字符串。
假设指针在你的机器上是4个字节,这条线会产生分配25×4 = 100字节的效果。
在C中,当你使用一个没有下标的数组名时,它“分解”成指向数组的第一个元素的指针。
所以当执行到这行...:
scanf("%s", player_name);
PLAYER_NAME点为100个字节的内存,足够的空间足以容纳在(以及99个字符加上终止NUL字节)读取100个字符。编译器不会保护您将这些字符存储在分配给25个指针的内存中。
最后:
foo = initFoo(player_name);
被传递数组的起始地址到函数initFoo()。编译器知道这可能是错误的,因为initFoo()应该把指针指向字符,而不是指向一个char指针数组的指针,但它可以让你做任何事情,除了警告。 initFoo()中的printf()语句将该指针重新解释为字符指针,并获得正确的结果!
正如其他人所说,这将是正确的一个线改变为
char player_name[25];
它声明的25个字符阵列。
如果你把方法纠正,我会删除我的答案。 – ojblass 2009-04-08 01:32:19