好吧,问题主要在上面。我唯一能补充的是,我已经尝试了str+i
和&(str[i])
,它们都给了我discards 'const' qualifier from pointer target type
警告。
或者有没有其他方法可以在没有警告的情况下类似strstr
和strchr
(它们的C版本中都没有常量限定符(?
使用强制转换告诉编译器您的转换是有意的:
char *foo(const char *p)
{
return (char *) p;
}
注意:根据C 2018 6.3.2.3:,删除限定符的转换是由C标准定义的,当它们将指针转换回原来的类型时
指向对象类型的指针可以转换为指向不同对象类型的指示器。如果结果指针没有正确对齐引用的类型,则行为是未定义的。否则,当再次转换回时,结果应与原始指针进行比较…
因此,如果某个char *
指针x
已转换为const char *x
,则将其转换回char *
将产生原始值。
如果指针最初不是不合格的,那么将其转换为不合格类型通常不是完全由C标准定义的。标准告诉我们可以将结果转换回其原始类型以获得原始值,但它并没有告诉我们可以将该结果用于其他用途。例如:
const int i;
const int *x = &i; // Defined, x points to i.
int *p = (int *) x; // Defined, p is a pointer that can be converted back to "const int *".
printf("%dn", *p); // Not defined, value of p is not defined for “normal” use.
const int *y = p; // Defined, produces y such that y == x and y == &i.