所以它似乎意味着a pointer to a constant pointer to char
。那是它指向char * const
,到目前为止一直很好。
令我困惑的是我在哪里以及如何看待它。我正在查看qsort
的手册页,示例执行以下操作将指针转换为char **
(字符串数组)的元素,(指向const void *
元素的指针)可以提供给strcmp
的正常char指针:
static int
cmpstringp(const void *p1, const void *p2)
{
/* The actual arguments to this function are "pointers to
pointers to char", but strcmp(3) arguments are "pointers
to char", hence the following cast plus dereference */
return strcmp(* (char * const *) p1, * (char * const *) p2);
}
我的问题是,为什么有char * const *
的演员?为什么不只是const char **
(因为最终我们想要const char *
发送给strcmp
)?
答案 0 :(得分:5)
char * const *
确实意味着指向chars的常量指针。在该问题的代码中执行此强制转换的原因如下:
p1
和p2
是指向常量位置的(非常量)指针。我们假设这个位置的类型是const T
。
现在我们要将p1
和p2
投射到他们的真实类型。我们知道数组的每个元素都是char *
,因此T = char *
。那是const T
是一个指向char的常量指针,它被写为char * const
。
由于p1
和p2
是指向数组元素的指针,因此它们的类型为const T *
,即char * const *
。
由于该函数仅调用strcmp
,因此如果将参数强制转换为char **
或const char **
或const char * const *
或其他任何内容,则不会产生任何差异。
答案 1 :(得分:5)
当一个函数声明它需要一个指向const的指针元素(例如strcmp()
)时,这意味着该函数承诺不通过指针对元素进行处理,这并不意味着传递给那个元素的参数函数必须是指针自身的指针。
请记住:const
修饰符是一个契约词,基本上意味着声明函数承诺不会修改const
修改的元素。向非const方向转换 - > const因此通常是好的。