2012-10-27 208 views
1

這裏是C代碼書「C程序設計語言」:施展無效**,爲什麼?

#include <stdio.h> 
#include <string.h> 

#define MAXLINES 5000 /* max #lines to be sorted */ 
char *lineptr[MAXLINES]; /* pointers to text lines */ 

int readlines(char *lineptr[], int nlines); 
void writelines(char *lineptr[], int nlines); 

void qsort(void *lineptr[], int left, int right, 
     int (*comp)(void *, void *)); 

int numcmp(char *, char *); 

/* sort input lines */ 
main(int argc, char *argv[]) 
{ 
    int nlines; 

    int numeric = 0; /* number of input lines read */ 

    if (argc > 1 && strcmp(argv[1], "-n") == 0) /* 1 if numeric sort */ 
     numeric = 1; 
    if ((nlines = readlines(lineptr, MAXLINES)) >= 0) { 
     qsort((void**) lineptr, 0, nlines-1, // MY QUESTION: WHY lineptr IS CAST TO POINTER TO A VOID POINTER 
       (int (*)(void*,void*))(numeric ? numcmp : strcmp)); 
     writelines(lineptr, nlines); 
     return 0; 
    } else { 
     printf("input too big to sort\n"); 
     return 1; 
    } 
} 


void qsort(void *v[], int left, int right, 
     int (*comp)(void *, void *)) 
{ 
    int i, last; 
    void swap(void *v[], int, int); 
    // rest of code 
} 

爲什麼當qsort函數被調用的第一個參數被強制轉換爲指向一個無效的指針(void **),而不僅僅是指針void(void *)。請告訴我爲什麼這樣?

感謝

+2

這是'qsort'所期望的參數類型。當你傳遞'lineptr'時,它會變成'char **',編譯器應該抱怨。將指針轉換爲預期類型會關閉編譯器,因爲它會顯示「我知道我在做什麼」並將參數轉換爲正確的類型。 –

回答

1

編譯器會警告你,這些天,除非你施放非空指針,當你將它們作爲空指針(如果作出任何意義上)空指針。不過,我認爲你知道這一點。

void **lineptr的簽名在C中等同於void *lineptr[],它是qsort作爲參數所使用的指針類型。有關更多詳細信息,請參閱this網站。

+0

嗨,謝謝!起初我沒有看到等價性。我現在看得很清楚。 – tautvilas

0

這裏,qsort函數定義了一個int (*comp)(void *, void *)參數,*comp是一個函數指針,可用於調用比較函數。即使它們沒有相同的功能名稱(compnumcmp),它仍然有效。

+0

[email protected]請回避舊帖子上的回覆。 – Dilip