2014-10-05 78 views
-1

比方说,我有为什么指向char的指针会产生警告?

char *greeting = "Hello"; 
char *names[] = { "Tom", "Jerry" }; 

我可以声明一个指向字符指针的names,这样

char **names2 = names; 

,但我不能为greeting这样做。

我得到警告:从不兼容的指针类型初始化。

为什么? greeting是指向char的指针,就像names是指向char的指针数组,为什么我不能声明指向greeting的指针?

+0

'char ** names3 =&greeting;',数组的名字代表第一个元素的地址。 – BLUEPIXY 2014-10-05 23:10:56

回答

1

你只需要使用1x *!

因为char *和char **是不同的类型!

所以你试图用char *类型的变量分配给同类型char **

一个变量,而该给你一个警告

所以这应该工作:

char *greeting = "Hello";    
char *names[] = { "Tom", "Jerry" };  

char *greeting2 = greeting;   //Type char * 
char **names2 = names;    //Type char ** 
+2

'names'的类型不是'char **'。但是,它在表达式中使用时会衰减到该类型......例如,“names2”的初始化程序。 – 2014-10-05 23:17:48

+0

谢谢。正如BLUEPIXY指出的那样,我可以使用'char ** names2 =&greeting;' – intelli78 2014-10-06 13:10:39

-1

在C中,指针和数组是紧密关联的。

做这样的事情:

char* names[] = {"Tom","Jerry"}; 

是一样的做这样

char** names = {"Tom", "Jerry"}; 

事物的char*值不能分配给char**价值,因为他们是不同类型的。


让我们从数组的角度来看待同样的事情。
这两个变量可以声明如下:

char greeting[8] = "Hello"; 
char names[][5] = { "Tom", "Jerry" }; 

上面的例子应清楚,即greetings是单一尺寸的阵列,而names是双尺寸数组和两个因此不相容

+2

这是错的:'char ** names [] = {“Tom”,“Jerry”};' – wildplasser 2014-10-05 23:09:34

+0

@wildplasser是的,错字! – gldraphael 2014-10-05 23:11:55

+0

“做类似:char * names [] = {”Tom“,”Jerry“}; 与做类似char ** names = {”Tom“,”Jerry“}; - 不,那没什么。后者具有太多的初始化器,并且初始化器具有错误的类型。 “一个char *值不能被分配给一个char **值,因为它们是不同的类型” - 然而你试图将“Tom”分配给一个“char **”。 “指针和数组密切相关” - 这是一个常见的误解。数组衰减指向表达式中的第一个元素,但它们与指针无关。 – 2014-10-05 23:19:59

相关问题