2010-08-24 76 views
1

gcc 4.4.4 c89指向字符數組的指針陣列

但是,我在嘗試顯示所有動物時出現問題。

我有以下代碼。

我想顯示數組中的所有動物。所以我有3個指向char *的指針數組。然後是指向這些數據集的指針數組。

我試圖控制內部循環來檢查外部的-1和NULL。

void initialize_char_array() 
{ 
    char *data_set1[] = {"dog", "cat", "bee", NULL}; 
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL}; 
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL}; 

    char *ptr_char[] = {*data_set1, *data_set2, *data_set3, NULL}; 

    display_char_array(ptr_char); 
} 

void display_char_array(char **ptr_char) 
{ 
    size_t inner = 0, outer = 0; 

    for(outer = 0; ptr_char[outer] != NULL; outer++) { 
     for(inner = 0; *ptr_char[inner] != -1; inner++) { 
      printf("data [ %s ]\n", ptr_char[outer][inner]); 
     } 
    } 
} 

非常感謝您的任何建議,

+0

而你的問題是? – 2010-08-24 07:19:49

回答

5

*data_set1data_set1[0]相同。 以下是您嘗試執行的固定版本。恕我直言,這是您使用的味道問題: 循環中的索引變量或指針迭代器,顯然編譯器將生成相同的機器代碼。

// type of ptr_char changed 
void display_char_array(char **ptr_char[]) 
{ 
    size_t inner = 0, outer = 0; 

    for(outer = 0; ptr_char[outer] != NULL; outer++) { 
     // check for NULL in inner loop! 
     for(inner = 0; ptr_char[outer][inner] != NULL; inner++) { 
      printf("data [ %s ]\n", ptr_char[outer][inner]); 
     } 
    } 
} 
void initialize_char_array() 
{ 
    char *data_set1[] = {"dog", "cat", "bee", NULL}; 
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL}; 
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL}; 

    // fixed 
    char **ptr_char[] = {data_set1, data_set2, data_set3, NULL}; 

    display_char_array(ptr_char); 
} 
+0

比我做的要乾淨得多。很好的答案! – 2010-08-24 07:38:20

+0

只是想知道** ptr_char []。這是一個指向char的指針數組。我以前從未使用過類似的東西。 – ant2009 2010-08-24 07:46:10

+1

@robUK - 將'[]'想象成另一個'*'。什麼是char數組[]?它是一個指向字符數組的指針,相當於'char * array'。什麼是char *數組[]'?它是一個char指針數組,等價於char **數組。什麼是char **數組[]'? (它相當於'char *** array'!)。 – 2010-08-24 08:12:01

3

鑑於你initialize_char_array函數初始化ptr_char陣列的方式,你將永遠無法顯示所有的動物。您將只能顯示三個列表中的每一個的第一個。如果你想能夠訪問你所有的動物,你應該首先定義ptr_char作爲指向char指針的指針數組:char **ptr_char[]

然後顯示功能應該採用這種類型的參數char ***作爲參數。是的,這是三層間接的。然後,請不要使用size_t變量來循環您的陣列,請使用char **之一和char *

1

嘗試(失敗)後,我重新寫你的程序調試你寫的版本:

#include <stdio.h> 

void display_char_array(char ***ptr_char) 
{ 
    for (; *ptr_char != NULL; ptr_char++) { 
     char **data_set; 
     for (data_set = *ptr_char; *data_set != NULL; data_set++) { 
      printf("data [ %s ]\n", *data_set); 
     } 
    } 
} 

void initialize_char_array() 
{ 
    char *data_set1[] = {"dog", "cat", "bee", NULL}; 
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL}; 
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL}; 

    char **ptr_char[] = { data_set1, data_set2, data_set3, NULL }; 

    display_char_array(ptr_char); 
} 

int main(void) 
{ 
    initialize_char_array(); 

    return 0; 
} 

你的版本將段錯誤,你的指針的用途是非常混亂!

+0

我正在試驗和修改源代碼。 -1曾經是一個錯誤。就像我用整數做同樣的程序一樣。它應該是一個NULL。 – ant2009 2010-08-24 07:47:41

1

的錯誤是僅僅從data_set的第一個元素ptr_char的初始化?見下圖:

void initialize_char_array() 
{ 
    char *data_set1[] = {"dog", "cat", "bee", NULL}; 
    char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL}; 
    char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL}; 

    char **ptr_char[] = {data_set1, data_set2, data_set3, NULL}; 

    display_char_array(ptr_char); 
} 

void display_char_array(char ***p) 
{ 
    while(*p) 
    { 
    while(**p) 
    { 
     puts(**p); 
     ++*p; 
    } 
    ++p; 
    } 
} 
2

它可以幫助走了過來類型每個陣列的。請記住,在大多數情況下,數組表達式的類型會從N-element array of T隱含轉換(衰減)到pointer to TT * 。在data_set1,data_set2和data_set3的情況下,Tchar *,因此表達式data_set1隱含地從4-element array of char *轉換爲pointer to char *char **。這同樣適用於其他兩個數組真實的,如下面的表格:

 
Array  Type   Decays to 
-----  ----   --------- 
data_set1 char *[4]  char ** 
data_set2 char *[5]  char ** 
data_set3 char *[6]  char ** 

如果你正在創建這些表達式的數組(這是你看起來是試圖做的),則數組聲明需要是

char **ptr_char[] = {data_set1, data_set2, data_set3, NULL}; 

這使我們

 
Array  Type   Decays to 
-----  ----   --------- 
ptr_char  char **[4]  char *** 

因此,ptr_char是一個指針數組的指針爲char,或char **ptr_char[4]。當您將ptr_char作爲顯示函數的參數時,它會再次從4-element array of char **類型轉換爲pointer to char **char ***


1.此規則的例外是當陣列表達或者是 sizeof&(地址)的運營商的操作數,或者如果表達爲字符串文字被用於初始化在另一個數組宣言。

+0

很好的解釋,非常有幫助。 – ant2009 2010-08-25 09:23:31