41673
C言語入門者です。ポインタの勉強をしています。

```

    #include <stdio.h>
    main()
    {
        char s[] = "I love cat and dog.";   /*探す対象の文字列*/
        char c = 'a';   /*探す文字*/
        char *p = s;
        int n = 0;
    
        printf("\"%s\"の中から\'%c\'を探します。\n", s, c);
        while(*p != '\0'){
            if(*p == c){
                printf("%d文字目で発見しました。\n",p-s+1);
                n++;
            }
            p++;
        }
        if(n == 0)
            printf("1つも見つかりませんでした。\n");
        else
            printf("全部で%d個見つかりました。\n", n);
    }
    
```

以上のプログラムにてstrchr()関数の代わりにwhile()関数で表したいのですが  
・`while(*p == '\0')`の時はどんな時なのか  
・`if(*p == c)`にて`char *p = s;`が何を意味するのか  
が分からなかったのでご教授お願い致します。
CC BY-SA 3.0
2018-02-12T13:54:29.370
41671
2018-02-12T23:46:23.987
2018-02-12T13:55:44.047
3605
27276
question
c
strchr()の代わりにwhile文で表す方法について
`while(*p == '\0')`は`while(*p != '\0')`の間違いだと思いますが、

> `while(*p == '\0')`の時はどんな時なのか

C言語において`'\0'`は文字列の終わり(最後の文字の一つ後)を表す文字として使われています。従ってこのwhile文の条件は「ポインタ`p`が文字列の終わりに達するまで」を意味しています。

> `if(*p == c)`にて`char *p = s;`が何を意味するのか

`s`は配列を表す変数ですが、`char *p = s`と書くと、ポインタ`p`が配列`s`の先頭を指すようになります。

また`*p`によってポインタ`p`の指しているアドレスに格納されているデータ(この場合は`char`)を取得できるので、`if(*p ==
c)`では`p`の指している文字が`c`と一致するかを調べていることになります。

ちなみに`while`は関数ではなく[文](https://ja.wikipedia.org/wiki/While%E6%96%87#C%E3%81%8A%E3%82%88%E3%81%B3%E3%81%9D%E3%82%8C%E3%81%AB%E9%A1%9E%E3%81%99%E3%82%8B%E8%A8%80%E8%AA%9E)ですね。
CC BY-SA 3.0
2018-02-12T14:17:10.333
41673
2018-02-12T23:46:23.987
2018-02-12T23:46:23.987
13199
13199
41671
answer