2012-06-06 129 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的方向轉換通常是可以的。

相關問題