用C

2015-02-08 43 views
1

鑄造一個const void *的,以一個const char *所以我有一個C函數是這樣的:用C

int cmp (const void *a, const void* b) 
return rot13cmp((const char*)a, (const char*)b); 
} 

和rot13cmp是另一個函數,接受類型爲const char的兩個參數*。

我將此函數傳遞給C qsort函數的比較參數,但它似乎不起作用。

但是,如果我不是做

return rot13cmp (*(const char **)a, *(const char **)b); 

投的常量無效*變量的函數,然後開始工作。我看了這篇文章,但是每個消息來源都說第一種鑄造方法應該起作用,所以我想知道爲什麼只有第二種方法適用於我?

編輯:下面是相關的代碼我有,

int cmp (const void *a, const void *b) { 
return rot13cmp((const char *)a, (const char *)b); 
} 

int rot13cmp (const char *a, const char *b) { 
while (*a == *b && *a != '\n') { 
    a++; 
    b++; 
} 

if (*a == *b) { return 0; } 
else if (*a == '\n') { return 1; } 
else if (*b == '\n') { return 1; } 
else { return rot13(*a) - rot13(*b); 
} 

和ROT13返回由字母表中的13個字母旋轉的字母的ASCII碼的int。

我通過執行

qsort(words, word_count, sizeof(char*), cmp); 

其中詞語是字符數組**和word_count中是一個int稱爲的qsort。 cmp也只是

+6

我覺得像[SSCCE](http://www.sscce.org)在這裏真的會有幫助。 – 2015-02-08 16:33:34

+0

發生這種情況肯定有其他原因。 – 2015-02-08 16:33:53

+0

那麼你是怎麼稱呼'qsort()'的? – timrau 2015-02-08 16:34:53

回答

3

qsort()使用指向應該比較的數組元素的指針調用比較函數。

如果你的數組包含const char*,這意味着比較函數被指向這些指針的指針調用,你必須相應地進行轉換和解引用。

With (const char*)a您正在解釋參數,就好像它是指向const char的指針一樣。但事實並非如此。實際上,它是指向輸入數組中的const char*的指針。

這就是爲什麼(const char**)a是正確的強制轉換,它將該參數解釋爲指向const char*的指針。要進行字符串比較,您需要指向const char*,您可以通過取消引用鑄幣值*來訪問它。

您可以將其視爲首先更正類型(通過強制轉換),然後訪問指向的值(通過取消引用)。

兩次嘗試之間的區別在於第二種情況會執行額外的解除引用。這很重要,因爲qsort()不直接通過const char*,而是將指針傳遞給它。所以我們必須看着指向價值來找到我們正在尋找的東西。通過直接投射到const char*我們只是聲稱變量會包含這樣一個指針,它不會很好地結束,因爲情況並非如此。

+0

你認爲你可以詳細說明嗎? 我認爲這兩個(char *)和*(char **)是有效的方法來投/ /引用,但我想知道爲什麼後者工作。 – 2015-02-08 17:32:30

+0

*(char **)取消引用傳入的指針,而(char *)只是一個強制轉換。 – Jake 2015-02-08 17:50:44

+0

@ChangLiu:我添加了更多細節。 – sth 2015-02-08 19:10:52