2012-06-06 85 views
0

所以它好像意味着a pointer to a constant pointer to char。这是它指向一个char * const,迄今为止很好。什么是char * const *?

让我困惑的是我在哪里以及如何看到它的使用。我一直在寻找的手册页qsort和示例执行以下操作的指针转换为char **(一个字符串数组)的元素,(指针元素视为const void *)正常字符指针可供给到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 *?为什么它不只是一个const char **(因为最终我们想发送const char *strcmp)?

+0

我一旦完成打字就得到了答案(D'oh) – Shahbaz

+1

您应该查看http://cdecl.org/ - 它将“C乱码”转换为英文,反之亦然:) – Polynomial

+0

@Polynomial , 是的,我知道。了解类型并不是一个真正的问题。我只是不知道如何在标题中提出这个问题的总结。随意编辑标题。 – Shahbaz

回答

5

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

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

现在我们要将p1p2转换为它们的实际类型。我们知道阵列的每个元素都是char *,因此T = char *。那就是const T是一个指向char的常量指针,写成char * const

p1由于和p2是指针指向数组的元素,它们是const T *类型,这是char * const *的。

由于函数只调用strcmp,其实它不会作出任何区别,如果该参数转换为char **const char **const char * const *或什么的。

5

当一个函数声明它需要一个指向常量元素的指针(例如strcmp())时,它意味着该函数承诺不通过指针来实现元素,这并不意味着传递给该函数的参数必须是指向const的指针本身。

请记住:const修饰符是一个合约名词,基本上意思是声明函数承诺不修改const修改的元素。因此,在非const - > const的方向转换通常是可以的。

相关问题