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

字符串与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'。 我对指针有什么想法?

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

+0

如果你把方法纠正,我会删除我的答案。 – ojblass 2009-04-08 01:32:19

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个字符阵列。