アプリ版:「スタンプのみでお礼する」機能のリリースについて

例えば

char str[] = "mojiretu"

と言うのがあって、文字列の終端を判定するのに
(str+8)がNULLではなく*(str+8)がNULLであることを判定します。

これってなぜですか?よろしくお願いします。

A 回答 (4件)

ヌルポインタとヌル文字の違い。


処理系によっては'\0'がNULLで定義されていて、どちらも「ヌル」と表現するので紛らわしい。
文字列の終端はヌル文字
str[]には実際には 'm','o','j','i','r','e','t','u','\0' の9文字が格納される。
    • good
    • 0

もしかして、ポインタの使い方がわかっていないのです


(str+8)はstrのアドレスに8キャラクタを加えた場所のアドレスで、*(str+8)はそのアドレスに格納されている内容です。

内容に関しては、ASCIIZ文字列で検索してみてください。

なお、文字列をどのように保持するかについては、処理系によって違う場合もあるし、今は多分無いと思いますが、GCOSやTOSBAC、ACOS6のBCDコードやUNIVACのFDコードで記述された場合、0x00は定義文字と重複する場合があるので、使えないで他の方法が使われる場合もあります。

余談ですが、EBCDICでCをコーディングする場合、中括弧{}が無いので、@(と@)で代用します。というように、こういう話は、処理系とコード系まで考えないと間違ってしまうこともあります。
    • good
    • 0

#1さんも仰っている通り、文字列の終端は'\0'であって、NULLではありません。


メモリー上の値を見るとchar型の0が入っているようにしか見えないため、(void*)0であるNULLと同じ値のように見えてしまうかもしれませんが、両者は型もその概念も別のものです。

あと、NULL というのは (void*)0ですから、str+8==NULLなら、str==-8になってしまいます。

文字列の終端が'\0'な理由は、そう決めたからでしょうね。
有限な配列を示すには長さをどこかで教える方法か終端記号を決めておく方法かのどちらかしかとれませんが、C言語の文字列では後者の方法を使っていて、'\0'を終端記号として使っています。
    • good
    • 0

>(str+8)がNULLではなく*(str+8)がNULLであることを判定します。



文字列の終端はNULLではなくて'\0'です。
*(str+8)、つまりstr[8]が'\0'であることをもって、
文字列の終端を判定します。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!