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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

4回答

1707閲覧

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

reotantan

総合スコア295

C++

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

2グッド

1クリップ

投稿2015/12/16 22:56

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

kozuchi, edom18👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/16 23:50

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

2015/12/17 00:06

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

回答4

0

ベストアンサー

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

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

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

投稿2015/12/16 23:06

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/12/16 23:21

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

0

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

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

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

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

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

という事の様です。

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

[NULLについて](http://www.geocities.jp/bleis_tift/cpp/null.html) [C++11 では NULL ではなく nullptr を使う](http://program.station.ez-net.jp/special/handbook/cpp/syntax/nullptr.asp)

投稿2015/12/16 23:24

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/12/16 23:26

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

0

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

投稿2015/12/16 23:08

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/12/16 23:23

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

0

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

投稿2015/12/16 23:03

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/12/16 23:15

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

2015/12/17 04:29

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問