0

所以它似乎意味着a pointer to a constant pointer to char。那就是它指向 a char * const,到目前为止一切顺利。

让我感到困惑的是我在哪里以及如何看到它使用的。我正在查看手册页,qsort示例执行以下操作以将指向 a char **(字符串数组)的元素的指针(指向被视为 的元素的指针const void *)转换为可提供给的普通 char 指针strcmp

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 *?为什么它不只是 a const char **(因为最终我们想发送 a const char *to strcmp)?

4

2 回答 2

6

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

p1并且p2是(非常量)指向常量位置的指针。让我们假设这个位置的类型是const T

现在我们要转换p1p2它们的真实类型。我们知道数组的每个元素都是一个char *,因此T = char *。那是const T一个指向 char 的常量指针,写成char * const.

因为p1p2是指向数组元素的指针,所以它们的类型const T *是 ,即char * const *.

由于该函数仅调用strcmp,因此实际上,如果将参数强制转换为char **orconst char **const char * const *or ,则不会有任何区别。

于 2012-06-06T15:07:28.893 回答
5

当一个函数声明它需要一个指向 const 元素的指针(例如strcmp())时,这意味着该函数承诺不会通过指针修改元素,这并不意味着传递给该函数的参数必须是指向 const 的指针他们自己。

请记住:const修饰符是一个合同条款,基本上意味着声明函数承诺不会修改被修改的元素const。因此,非 const -> const 方向的转换通常是可以的。

于 2012-06-06T15:10:53.873 回答