2017-10-09 72 views
0

多維陣列列我有一個15×15陣列,其我有指針(HW )遍歷。我正在寫一個謎題解決,我需要垂直搜索一些的話,我已經做了水平搜索,但我無法橫越column.I陣列列在嘗試分配PTR每次TMP的TMP達到結束後柱。使用指針來遍歷由

void VerticalSearch(char** puzzleArray, searchedWord* word) { 

int len = word->wordLength; 

char **tmp = puzzleArray; 
char *ptr = &puzzleArray[0][0]; 

string s; 

for (int i = 0; i < 15; i++) { 

    **tmp = *ptr; 
    s = ""; 
    for (int k = 0; k < 15; k++) 
    { 
     s += **tmp; 
     (tmp)++;  

    } 
    cout << s << endl; 
    ptr++;   

} 
} 
+3

*「我需要用指針來遍歷」 *爲什麼呢? '對(INT I = 0; I = 15;!++ⅰ){對於(INT J = 0; J = 15;!++ j)的{FOO(puzzleArray [i] [j]); }}'和'對(INT J = 0; J = 15;!++ j)的{對(INT I = 0;!I = 15; ++ⅰ){FOO(puzzleArray [i] [j]); }}'將允許在兩個方向上遍歷矩陣。 – Jarod42

+0

「我試圖在每次tmp達到列結尾時將ptr分配給tmp。」你永遠不會分配到'tmp'。 for循環的第一行是分配給由'tmp'指向的第一個指針所指向的字符。 –

+3

另外,如果你可能*可以避免使用指針指針。看看'std :: array'或'std :: vector'。他們都更容易推理。 –

回答

2

要真正做到你需要的,你必須利用數組在內存中的分配方式。

我會假設你實際上(在主char puzzle[15][15]某處)分配在堆棧上的數組。在這種情況下,即使將它傳遞給此函數也會給出警告(請參閱this answer),但它可能會起作用。

陣列被分配在一個行主要形式,這意味着

a1, a2, a3, b1, b2, b3, c1, c2, c3

成爲記憶

a1,a2,a3,b1,b2,b3,c1,c2,c3

所以,實際上你可以做這樣的事情

void VerticalSearch(char** puzzleArray, searchedWord* word) { 

    int len = word->wordLength; 

    char** tmp; // initialize the pointer 

    string s; 

    for (int i = 0; i < 15; i++) { 
     tmp = puzzleArray + i; // update with the i-th char of the first row 
     s = ""; 
     for (int k = 0; k < 15; k++){ 
      s += *tmp; 
      tmp += 15; //each time you read a character from the column 
         // go to the next character of the same column 
         // one row far 
     } 
     cout << s << endl;  
    } 
} 

這應該工作,我沒有嘗試過。

順便說一下,避免使用指針算術,如果你可以,一般來說,特別是在數組上,它可以給嚴重的頭痛,並導致錯誤。 使用通常的數組索引,讓編譯器照顧這個東西。

有關矩陣是如何保存在內存的詳細信息,請參閱this

+0

'tmp = puzzleArray + i; //用第一行的第i個字符更新'此行更新列的第i個字符,而不是行。 –

+0

該行不會更新字符本身,而是使用第一行的第i個字符更新'tmp'指針,這又是第i列的第一個字符。 – bracco23

+0

我的意思是它不會更新第一行的第i個字符的tmp指針,它會逐行遍歷。 –