从不兼容的指针类型传递`foo'的arg 1

时间:2013-05-14 12:02:59

标签: c gcc ansi

为什么会显示警告:

#include<stdio.h>
foo (const char **p)
{ 

}

int main(int argc , char **argv)
{
    foo(argv);
}

但是以下没有显示任何警告

char * cp;
const char *ccp;
ccp = cp;

第一个代码段显示警告从不兼容的指针类型传递foo的arg 1。但第二个片段没有显示任何警告。两者都是const指针

3 个答案:

答案 0 :(得分:1)

请参阅C FAQ list

您可以进行投射以删除警告:

foo((const char **)argv);

但正如常见问题解答所述:对此类演员表达的需求可能表明演员阵容没有真正解决的更深层次的问题。

答案 1 :(得分:0)

根据您的编译标志,在将cp的内容分配给ccp时可能需要显式强制转换。

答案 2 :(得分:0)

在第一个版本中,您在两种不同类型的指针之间进行投射,而不是简单地向指针添加const

  • char **是指向(char
  • 指针的指针
  • const char **是指向(const char
  • 指针的指针

正如你可以看到这些指针指向不同类型的类似于更明显可疑的类型:

int *i;
double *d;
d = i;

在你的第二个例子中,你看到你可以从指针转换为const指针,所以如果要将它应用于你的情况,你需要有一个const指针(指向char的指针)

foo(char * const *p);