2016-04-03 12 views
-2

私はC言語を学習しています。私は自分の学習教材でこの機能を見つけました。この関数は文字列ポインタと文字を受け取り、その文字列に含まれる文字の数を数えます。たとえば、文字列がthis is a stringおよびch = 'i'の場合、関数はという3回の出現に対して3を返します。whileループで文字ポインタを理解する

私が混乱している部分はwhileループにあります。私はwhile(buffer[j] != '\0')のようなものを読んで、ヌル値を読み取るまでプログラムが各要素jを循環することを期待していました。私は、whileループでwhileループがどのように動作するのかを知りません。また、ヌル値に達するまでbuffer++を使ってプログラムを文字単位でどのようにインクリメントするのかを知ることはできません。私はデバッグを使用しようとしましたが、何らかの理由で動作しません。前もって感謝します。それはあなたが文字列全体をスキャン知って、その時点でnull文字、を指すまで、あなたはポインタbufferをインクリメントしているループで

int charcount(char *buffer, char ch) 
{ 
int ccount = 0; 
while(*buffer != '\0') 
{ 
    if(*buffer == ch) 
     ccount++; 
    buffer++; 
} 
return ccount; 
} 

答えて

0

bufferは、charデータ、文字列、またはcharデータを保持するメモリバッファのセットへのポインタです。

*bufferは、bufferの値をcharとして参照します。これはヌル文字と比較できます。

bufferに追加すると、アドレスに追加するアドレスではなく、buffer++はアドレスに1を加え、次のcharを指します。つまり、今度は*bufferという文字が次の文字になります。

0

buffer[j]の代わりに*(buffer+j)と同等ですが、ポインタ自体をインクリメントしています。

buffer++と言うときは、bufferに格納されているアドレスを1だけインクリメントします。

ポインタがどのように機能するかを内部的に説明すると、このコードは、別のインデックスを使用して文字列をスキャンするコードよりもきれいです。

+0

** buffer ++ ** line 8 –

0

CおよびC++では、配列は順番に格納され、配列はその最初のアドレスと長さに従って格納されます。

したがって、* bufferは実際には最初のバイトのアドレスで、buffer [0]と同義です。あなたは、文字列内のヌル終了がによって指されていない場合 - 文字列はヌルを終了してしまうので、これはを動作することを

int charcount(char *buffer, char ch) 
{ 
    int ccount = 0; 
    int charno = 0; 
    while(buffer[charno] != '\0') 
    { 
     if(buffer[charno] == ch) 
      ccount++; 
     charno++; 
    } 
    return ccount; 
} 

注:このため、あなたはこのように、配列としてbufferを使用することができます*bufferそれは永遠に続きます。配列の長さをcが知っている部分を失う。これは、あなたがポインタと長さを渡す非常に多くのc関数を見ている理由です - ポインタは配列の[0]の位置を示し、あなたが指定するサイズは読み込みをどれだけ保持するかを示します。

これが役に立ちます。

関連する問題