2016-03-07 91 views
0

所以我是一個初學C編程和理解指針,如何使用它們仍然給我一些麻煩。在這裏,我只是試圖通過使用指針來遍歷數組。我已經得到了下面這段代碼,但不是以55結尾,而是打印一個附加值(32765)。首先,有人可以向我解釋爲什麼我會得到額外的價值嗎?其次,有人能告訴我如何將這個程序限制在數組中的值嗎?我嘗試使用* pntr < 5作爲條件,但是沒有打印。通過指針的數組迭代

void iterate(int* li) { 

    for (int *pntr = li; *pntr; pntr++) { 
     printf("%d\n", *pntr); 
    } 
} 

int main(){ 

int values[] = {11, 22, 33, 44, 55}; 

iterate(values); 
} 
+1

想一想'pntr'一旦'pntr'不再指向您的任何值 –

+1

因爲您調用了未定義的行爲。 「int」數組不需要以null結尾,所以不需要滿足「for」循環終止條件。 –

回答

3

這是正確的代碼

void walk(const int *arr, size_t n) 
{ 
    int *p; 

    for (p = arr; p < arr + n; ++p) 
     printf("%d\n", *p); 
} 

這是因爲arr + n得到的從arr基地址n整數地址。另外,int數組不是空終止的;只有char陣列與引號一起使用(​​而不是{'a', 'b', 'c'})。

+0

感謝您的迴應,這絕對清除了我的事情。通過谷歌搜索我能找到的大部分都是參考char數組,所以我可以看到我在這裏感到困惑。 – JIPtheVIP

+0

如果答案對您有幫助,您可以點擊答案旁邊的複選標記將其選爲「接受答案」 – stackptr

1

for循環:

for (int *pntr = li; *pntr; pntr++) { 
    printf("%d\n", *pntr); 
} 

...期望陣列是零終止。通過使用*pntr作爲測試,您正在測試pntr指向的值不爲零。因此,如果數組不是以零結尾,則循環會在數組末尾飄移,直到遇到零或導致段錯誤。

0

你的代碼總體不錯,但它缺少一個主要因素:工作結束條件。

在您的for循環中,當您編寫*pntr時,結束條件將是循環在達到指向值0時停止。但是,由於數組包含非零值,因此它將爲您的數組獲取超出分配內存的值。

幸運的是,你只能看到一個額外的價值,但你可能會看到更多的價值。

要修復缺失的結束條件,您有兩種解決方案:要麼使用您的iterate函數共享陣列的長度,要麼添加一個已知值爲數組的最終值的值。

因此,無論你做:

void iterate(const int *arr, size_t n) { 
    for (it = arr; it < arr+n ; +=it) printf("$d\n", *it); 
} 

,或者你可以這樣做:

#define LAST_ITEM -1 

int values[] = {11, 22, 33, 44, 55, LAST_ITEM}; 

void iterate(const int *arr, size_t n) { 
    for (it = arr; *it != LAST_ITEM ; +=it) printf("$d\n", *it); 
} 

(你可以使用#define LAST_ITEM 0,只要您使用的值是不可能發生的數組中) 。

在這兩種解決方案中,最好的方法就是考慮數組的大小。