• ベストアンサー

文字列の最後がNULL ?

例えば char str[] = "mojiretu" と言うのがあって、文字列の終端を判定するのに (str+8)がNULLではなく*(str+8)がNULLであることを判定します。 これってなぜですか?よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.4

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

その他の回答 (3)

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.3

もしかして、ポインタの使い方がわかっていないのです (str+8)はstrのアドレスに8キャラクタを加えた場所のアドレスで、*(str+8)はそのアドレスに格納されている内容です。 内容に関しては、ASCIIZ文字列で検索してみてください。 なお、文字列をどのように保持するかについては、処理系によって違う場合もあるし、今は多分無いと思いますが、GCOSやTOSBAC、ACOS6のBCDコードやUNIVACのFDコードで記述された場合、0x00は定義文字と重複する場合があるので、使えないで他の方法が使われる場合もあります。 余談ですが、EBCDICでCをコーディングする場合、中括弧{}が無いので、@(と@)で代用します。というように、こういう話は、処理系とコード系まで考えないと間違ってしまうこともあります。

回答No.2

#1さんも仰っている通り、文字列の終端は'\0'であって、NULLではありません。 メモリー上の値を見るとchar型の0が入っているようにしか見えないため、(void*)0であるNULLと同じ値のように見えてしまうかもしれませんが、両者は型もその概念も別のものです。 あと、NULL というのは (void*)0ですから、str+8==NULLなら、str==-8になってしまいます。 文字列の終端が'\0'な理由は、そう決めたからでしょうね。 有限な配列を示すには長さをどこかで教える方法か終端記号を決めておく方法かのどちらかしかとれませんが、C言語の文字列では後者の方法を使っていて、'\0'を終端記号として使っています。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

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

関連するQ&A

専門家に質問してみよう