2015-02-07 130 views
0

我有一個函數,我有2個空指針(規範的一部分),但我知道他們是char *。我想遍歷char數組,所以我試圖創建一些指針來遍歷它們。當我這樣做,我的程序無法正常工作:指針初始化以遍歷數組

int foo(void const * first, void const * second) 
{ 
    char const * firstIt = (const char*) first; 
    char const * secondIt = (const char*) second; 
    ... 
} 

但是,如果我這樣做:

int foo(void const * first, void const * second) 
{ 
    char const * firstIt = *(const char**) first; 
    char const * secondIt = *(const char**) second; 
    ... 
} 

兩者有什麼之間的差異爲什麼第二個工作?我不知道我是否包含足夠的細節,因此如果需要更多信息,我很樂意提供。

+0

沒有足夠的信息,我試了第一個適合我的作品 – 2015-02-07 01:17:51

回答

1

如果第二個工作,這是因爲你指出的函數的void指針可能真的是任何東西,我猜你正在向函數傳遞指針的指針。例如,下面的代碼工作:

#include <stdio.h> 
#include <stdlib.h> 

int foo(void const * first, void const * second); 
int goo(void const * first, void const * second); 

int main() { 
    char * a, * b; 

    a = malloc (sizeof (char)); 
    b = malloc (sizeof (char)); 

    *a = 'z'; 
    *b = 'x'; 

    goo (&a, &b); /* critical line */ 

    free (a); 
    free (b); 

    return 0; 
} 

int foo(void const * first, void const * second) { 
    char const * firstIt = (const char*) first; 
    char const * secondIt = (const char*) second;  
    printf ("%c %c", *firstIt, *secondIt); 
    return 1; 
} 

int goo(void const * first, void const * second) { 
    char const * firstIt = *(const char**) first; 
    char const * secondIt = *(const char**) second; 
    printf ("%c %c", *firstIt, *secondIt); 
    return 2; 
} 

然而,對於上面的程序與功能foo你需要與形式的呼叫來代替臨界線工作:

foo (a, b); 

請問區別有意義嗎?它解決了你的問題嗎?

1

第一種方法假定調用者已經通過char *(const以某種方式限定)。

第二個假設調用者已經通過char **(const以某種方式限定)。

如果第二個工作,這意味着你的調用者正在傳遞一個char **。

第一個不能工作的原因是未定義的行爲。具有一種類型的指針,轉換爲另一種類型,並將其解引用爲除原始類型以外的任何其他類型都會導致未定義的行爲。通過void指針往返不會改變這一點。

這就是編譯器抱怨一種指針類型隱式轉換爲另一種指針類型的原因(除了void指針和void指針之外)。