質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • C++

    4188questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

NULLがコンピューター内部でどのように実装されているのか

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 906

reotantan

score 249

NULLを使っているうちに感じたのが、パソコン内部ではすべてのデータは01だけで表現できるわけで、NULL(何もデータが入っていない)という概念はPCは理解できないわけで、何もデータが入っていないという認識にする値、アドレスを実際には入れていると考えました。
ただ実際には、この何も入っていないという状態を示すアドレスが一つあり、NULLというものを入れることで、それを示すという認識で正しいですか?
よく考えてみると、パソコンの中の0,1というのは存在するか、しないかではなく、二つの要素であり、これらから文字通り何も存在しないという事は表現することは不可能ですよね?
皆さまのお考えをお聞かせください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2015/12/17 08:50

    C++タグが付いているので回答もそれに沿ったものになっているようですが、質問文のニュアンスからは、言語非依存的な疑問なのかな、とも感じました。ともあれ、C++のNULLは特殊なので一般化できない部分もあることに注意してください。こちらが(本文だけでなくコメントも)参考になるかと: http://qiita.com/go_astrayer/items/6afb1592a8a5763fede1

    キャンセル

  • reotantan

    2015/12/17 09:06

    はい、最近c++をよく使うものでついタグをc++にしてしまいました。
    回答者様のおっしゃる通り、言語を問わず一般的なNULLについて質問したつもりでした。ご指摘ありがとうございました。

    キャンセル

回答 4

checkベストアンサー

+4

NULLはマクロで、中身を見ると0とか(void*)0というようになっています。

で、(ポインタとしての)0は、コンパイラが「無効な位置を指す値」に変換してもいいことにはなっていますが、多くの処理系ではそのまま「0」としてコンパイルされます。

Unix系とか32ビットのWindowsは、プロセスごとに仮想メモリ領域を切ってあるので、「0番地」を有効範囲に入れないことで、アクセスしたらエラーが出るような仕組みになっています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/17 08:21

    なるほど、そういう事でしたか、解説ありがとうございました

    キャンセル

+1

結論を簡潔に書けば C++ の処理系によって異なる ということです。  

パソコンの中の0,1というのは存在するか、しないかではなく、二つの要素であり、これらから文字通り何も存在しないという事は表現することは不可能ですよね?  

それは確かにおっしゃる通りですが、コンピューターの世界だけが特別な訳ではありません。数学の世界でも、何も無いという概念を「表現」するために、「0」(ゼロという記号)を発明し世界共通のルールにする必要がありました。  

しかし、C++ の NULL の場合は  

  • C との互換性維持の為に残されているだけ  
  • C の NULL は言語仕様として厳密に定義・処理されている訳ではなく単なるマクロ定義(=処理系に依存)  

という事の様です。  

結果として、いろいろな弊害が発生しているらしく、下記ページに非常に詳しく解説されていますので、是非ご覧ください。  

    NULLについて  
    C++11 では NULL ではなく nullptr を使う  

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/17 08:26

    なるほど、弊害が実際にあるんですね。有益なサイトまで提示していただいて、ありがとうございました。

    キャンセル

0

言語は1つ以上の文字の集まりですが、それを使って「何も存在しない」という概念を表現できています。
それと同じです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/17 08:15

    言葉の意味としては説明できますが、物質的にできないという意味で発言しました>(説明が分かりにくくてすいません)
    0と1という二つの数字をどちらか必ず使うとして、要素がないという事を物質的にしは表せませんよね、もちろんNULLという事は意味的には何も存在しないという事で理解するのは正しいとは思うのですが、少し気になってこちらに挙げてみました

    キャンセル

  • 2015/12/17 13:29

    > 要素がないという事を物質的にしは表せませんよね、
    「要素がないと言うこと」を物理的に0/1でどう表すかを決めて、それで表しています。
    表現と概念が混同されてしまい、迷宮に入ってるんだと思います。

    キャンセル

0

C言語に限って言うと、どこのアドレスも指していないという意味のNULLは0で表現されています。
では本当にメモリの0番地を意図する場合はどうするか? 現実的には「指していない」のと区別しようがないわけですが、本当にそういう機会はありえないのかというとそこは私も曖昧にしたままですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/17 08:23

    メモリの0番地は、エラーが起きないようにNULLポインター以外には使わないのではと考えたのですが、どうなんでしょうね

    キャンセル

同じタグがついた質問を見る

  • C++

    4188questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。