什么是char * const *?

时间:2012-06-06 15:07:28

标签: c pointers casting

所以它似乎意味着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)?

2 个答案:

答案 0 :(得分:5)

char * const *确实意味着指向chars的常量指针。在该问题的代码中执行此强制转换的原因如下:

p1p2是指向常量位置的(非常量)指针。我们假设这个位置的类型是const T

现在我们要将p1p2投射到他们的真实类型。我们知道数组的每个元素都是char *,因此T = char *。那是const T是一个指向char的常量指针,它被写为char * const

由于p1p2是指向数组元素的指针,因此它们的类型为const T *,即char * const *

由于该函数仅调用strcmp,因此如果将参数强制转换为char **const char **const char * const *或其他任何内容,则不会产生任何差异。

答案 1 :(得分:5)

当一个函数声明它需要一个指向const的指针元素(例如strcmp())时,这意味着该函数承诺不通过指针对元素进行处理,这并不意味着传递给那个元素的参数函数必须是指针自身的指针。

请记住:const修饰符是一个契约词,基本上意味着声明函数承诺不会修改const修改的元素。向非const方向转换 - > const因此通常是好的。