什么是char*const*?

什么是char*const*?,c,pointers,casting,C,Pointers,Casting,所以它似乎意味着指向char的常量指针。也就是说,它指向一个char*const,到目前为止还不错 让我困惑的是我在哪里以及如何看到它的使用。我正在查看手册页,示例执行以下操作以将指针转换为字符的元素**字符串数组,指向被视为const void*的元素的指针转换为可馈送到strcmp的普通字符指针: 我的问题是,为什么要对char*const*进行强制转换?为什么它不只是一个常量字符**,因为最终我们要将一个常量字符*发送给strcmp?char*const*实际上意味着指向字符的常量指针。在

所以它似乎意味着指向char的常量指针。也就是说,它指向一个char*const,到目前为止还不错

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

我的问题是,为什么要对char*const*进行强制转换?为什么它不只是一个常量字符**,因为最终我们要将一个常量字符*发送给strcmp?

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

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*或其他形式,则不会产生任何影响。

当函数声明它使用指向常量元素(例如strcmp)的指针时,意味着函数承诺不会通过指针修改元素,这并不意味着传递给该函数的参数必须是指向const本身的指针


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

我一打完就得到了答案,哦,你应该检查一下——它将C语言转换成英语,反之亦然:@polymonal,是的,我知道。理解类型并不是一个真正的问题。我只是不知道如何在标题中对这个问题进行总结。请随意编辑标题。
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);
}