2016-09-02 47 views
3

這是查找特定字母出現的簡單函數。使用指針指向數組時,我們要做什麼?

1: int count_x(char *p, char a) 
2: { 
3:  int count = 0; 
4:  while(*p != '\0') 
5:  { 
6:  if (*p == a) 
7:   count++; 
8:  p++; 
9:  } 
10:  return count; 
11: } 

我們可以通過使用p[n]可以訪問特定的元素,或者我們可以取消對它的引用*p和獲取陣列爲例的第一元素,和所有的東西,我們通常做的。
我奇怪的是位於行號8 當我們寫p++,我們都可以從一開始,我們通過陣列-1符號。所以如果是hello, world那麼它會是ello, world。 我們通過指數迭代,但我真的不明白如何。

我可以解釋所有這些東西是如何工作的嗎?

+2

***,我們都可以從一開始,我們通過陣列-1象徵。***這是什麼意思? –

回答

4

循環條件*p != '\0'表示:*迭代,直到p指向的值爲'\0'。循環體內的聲明

p++; 

遞增指針傳遞給字符串的下一個字符。

對於第一次迭代

+--------+--------+--------+--------+--------+--------+--------+--- ----+--------+--------+--------+--------+ 
|  |  |  |  |  |  |  |  |  |  |  |  | 
| 'h' | 'e' | 'l' | 'l' | 'o' | ',' | 'w' | 'o' | 'r' | 'l' | 'd' | '\0' | 
|  |  |  |  |  |  |  |  |  |  |  |  | 
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+ 
^
    |  
    p 

第二次迭代:

+--------+--------+--------+--------+--------+--------+--------+--- ----+--------+--------+--------+--------+ 
|  |  |  |  |  |  |  |  |  |  |  |  | 
| 'h' | 'e' | 'l' | 'l' | 'o' | ',' | 'w' | 'o' | 'r' | 'l' | 'd' | '\0' | 
|  |  |  |  |  |  |  |  |  |  |  |  | 
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+ 
      ^
      | 
      p 

等。當p到達點'\0'時,條件*p != '\0'變成false並且循環終止。 在每次迭代時,它都是指針p,它改變它指向的位置。字符串保留在其初始存儲位置。

1

TL:DR - 使用指針數組,我們通過各個元素迭代,一樣的,因爲我們使用數組索引。


當你將一個數組傳遞給一個函數時,它會衰減到指向第一個元素的指針。因此,char *p指向數組中的第一個元素。

在這種情況下,該函數需要一個以NULL結尾的數組(或者指向以NULL終止的char數組的第一個元素)作爲第一個參數。

一旦你增加p,它指向下一個元素。這就是爲什麼,如果您嘗試打印傳入的字符串(實際上是"hello, world"),它現在打印"ello, world"

此外,通過檢查*p != '\0',你要確保你不走過去的陣列(空值終止)。

+0

好的,請問這個答案有什麼問題? –

+0

在我看來,這是一個正確的答案,我已經投了票。 –

+0

一旦您遞增p,它就指向下一個元素。 是的,我明白了。我的觀點是要確定所有這些是如何工作的? 當我們說p ++時,我們究竟增加了什麼? – Caleb

0

s[i]表達(其中s是一個字符陣列)評價方式如下:s的轉換爲指針到它的第一元件和所謂的指針運算被應用。然後結果指針被解除引用。

這樣你就可以成像s[i]通過以下方式

char *p = s; 
int i = 0; 
p = p + i; 
//... 
if (*p == a) count++; 

獲得下一個字符,你可以寫

++i; 
p = p + i; 
//.. 

然而,這相當於

++p; 
p = p + i; 

其中i有先前的值。

所以你可以增加指針的索引。現在姑且認爲i總是等於0

然後,你可以寫

char *p = s; 
int i = 0; 
p = p + i; 
//... 
if (*p == a) count++; 
++p; 
p = p + 0; 
if (*p == a) count++; 
// and so on 
相關問題