为什么显示警告:
#include<stdio.h> foo (const char **p) { } int main(int argc , char **argv) { foo(argv); }
但以下并没有显示任何警告
char * cp; const char *ccp; ccp = cp;
第一个代码片段显示了从不兼容的指针类型传递foo的arg1的警告。但第二个代码片段没有显示任何警告。两者都是const指针
foo
const
rslzwgfq1#
参见C FAQ list您可以强制转换以移除警告:
foo((const char **)argv);
正如FAQ所说:需要这样的转换可能表明转换并没有真正解决的更深层次的问题。
iaqfqrcu2#
根据编译标志,在将cp的内容分配给ccp时,可能需要显式强制转换。
kzipqqlq3#
在第一个版本中,你是在两种不同类型的指针之间转换,而不是简单地向指针添加const。
char **
char
const char **
const char
正如你所看到的,这些指针指向不同的类型,类似于更明显的问题:
int *i; double *d; d = i;
在第二个示例中,您可以看到可以从指针强制转换为常量指针,因此如果要将此应用于您的情况,则需要将常量指针指向(指向char的指针)。
foo(char * const *p);
3条答案
按热度按时间rslzwgfq1#
参见C FAQ list
您可以强制转换以移除警告:
正如FAQ所说:需要这样的转换可能表明转换并没有真正解决的更深层次的问题。
iaqfqrcu2#
根据编译标志,在将cp的内容分配给ccp时,可能需要显式强制转换。
kzipqqlq3#
在第一个版本中,你是在两种不同类型的指针之间转换,而不是简单地向指针添加
const
。char **
是一个指向(指向char
)的指针const char **
是一个指向(指向const char
)的指针正如你所看到的,这些指针指向不同的类型,类似于更明显的问题:
在第二个示例中,您可以看到可以从指针强制转换为常量指针,因此如果要将此应用于您的情况,则需要将常量指针指向(指向
char
的指针)。