0

つまり、という意味のようa pointer to a constant pointer to charです。それはchar * const、これまでのところ良いことを指しているということです。

私を混乱させるのは、それがどこでどのように使用されているのかです。私はのマニュアルページを見ていましたがqsort、例では、ポインタを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 *ですか?なぜそれは(最終的にはに送信したいので)だけではないのですconst char **か?const char *strcmp

4

2 に答える 2

6

char * const *実際、charsへの定数ポインタへのポインタを意味します。このキャストが質問のコードで実行される理由は次のとおりです。

p1およびp2は、一定の場所への(非定数)ポインターです。この場所のタイプがであると仮定しましょうconst T

次に、実際のタイプにキャストp1します。配列の各要素は、したがって、p2であることがわかっています。これは、charへの定数ポインタであり、として記述されます。char *T = char *const Tchar * const

p1p2は配列の要素へのポインタであるため、タイプはconst T *。ですchar * const *

関数は単にを呼び出すだけなので、実際には、パラメーターがorまたはorまたは何かstrcmpにキャストされても違いはありません。char **const char **const char * const *

于 2012-06-06T15:07:28.893 に答える
5

関数がconstへのポインター要素を取ることを宣言する場合(例えばstrcmp())、それは関数がポインターを介して要素を変更しないことを約束することを意味し、その関数に渡されるパラメーターがconstへのポインターでなければならないことを意味しません彼ら自身。

覚えておいてください:const修飾子はコントラクト用語です。基本的には、宣言関数が変更する要素を変更しないことを約束しconstます。したがって、non-const-> constの方向への変換は、通常は問題ありません。

于 2012-06-06T15:10:53.873 に答える