- ベストアンサー
NULL
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
NULLに関してはいろいろあるようでFAQ(よくある質問とその回答)の一項目にもなっています。 C FAQ 5 http://www.kouno.jp/home/c_faq/c5.html NULL と '\0' の違い http://www.kis-lab.com/serikashiki/C/C01.html CとC++で微妙にNULLの定義が違ってたりしますがそれに関してはこちらを。 C MAGAZINE - プログラミングの禁じ手Web版 C++編 - 理念の誤解に関するパターン http://www.cmagazine.jp/src/kinjite/cpp/idea.html
その他の回答 (5)
- kakusuke
- ベストアンサー率36% (95/259)
NULLはアドレス0x00000000(※0x00が格納されている)のこと、 文字配列の終端は定義上、0x00。 同値ですが、"\0"だと、ヒープ領域に自動的に確保されてしまいます。 ですから、アドレスは異なります。
お礼
回答ありがとうございます。 勉強にになります!
- jacta
- ベストアンサー率26% (845/3158)
一応指摘しておくと、NULLはC/C++の言語仕様で規定されています。ただし、言語本体が持っているのではなく、ヘッダで定義されます。 ちなみに、ヘッダがファイルであるかどうかは言語仕様では規定されていません。 nullの読み方については、日本ではドイツ語の数詞であるnull(0の意味)の方が馴染みがあるので、「ヌル」と発音するのでしょう。英語のnullも、元々はドイツ語からの借用語ですから、「ナル」と読むのは単に訛っているだけですね。 ちなみに、'\0'が「ナル文字」なのは、英語やドイツ語の発音はどうででもよくて、標準規格でそう定義されているから、あくまでも日本語で「ナル文字」なのです。
お礼
回答ありがとうございます。 いろいろ勉強になります。 ありがとうございました。
- chirubou
- ベストアンサー率37% (189/502)
基本的には他の回答者さんの通りで、値としてはゼロですが、型が違うものです。 NULL は正確にいうと C/C++ の言語では規定されていません。基本的には include ファイルで定義されているものです。 以下は余談。 もうずいぶんと昔になりますが(C以前のPL/Iの頃)、入社したてのころ、英語が文字通りペラペラの先輩がいて、「ヌル」と読んだら、「ヌルなんて気持ちが悪い!正しくはナルでしょ!」と怒られました。でもなぜか日本では皆「ヌル」と呼ぶようになってしまいましたネ。
お礼
すばやい回答ありがとうございます。 おもろい余談もありがとう!
- shukugawa
- ベストアンサー率30% (80/264)
「値」は同じですが「型」が違います。 ヌルという言葉のいうそもそもの言葉の意味はゼロです。ですから、ヌルとあれば0という値のことです。ですが C、C++ には型という物が存在するのでその違いがあります。 NULL はポインタが 0 であるということです。Cではその定数として使われます。 ex. char* p = NULL; \0 は文字コードが 0 であるということです。 ex. char c = '\0'; >nullはポインタなんですか? そういう意味のときもあります。前後関係でかわります。 >\0はヌル文字と呼べばいいんですか? そう呼ばれることがあります。
お礼
すばやい回答ありがとうございます。 なんとなくですが、違いが解りました! ありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
> NULLと、文字配列の終端文字、\0ヌル文字は、まったく同じものですか? まったく別のものです。 混同したとしても、たまたまコンパイルでき、たまたま期待通りに動くことがあるというだけです。 > nullはポインタなんですか? nullというのは、C/C++にはありません。 > \0はヌル文字と呼べばいいんですか? それでも構いませんが、規格上は「ナル文字」です。
お礼
すばやい回答ありがとうございます。 参考にします! ありがとうございました。
関連するQ&A
- 文字列の最後がNULL ?
例えば char str[] = "mojiretu" と言うのがあって、文字列の終端を判定するのに (str+8)がNULLではなく*(str+8)がNULLであることを判定します。 これってなぜですか?よろしくお願いします。
- ベストアンサー
- C・C++・C#
- NULLポインタについて
NULLポインタはどこのアドレスも指さないポインタのことですよね。 printf("%p\n",&NULL);とすると00000000が 表示されます これはアドレスの0番地を指しているということでしょうか? でもNULLのアドレスが0番地なら、NULLポインタはどこのアドレスも指さないポインタというのと矛盾しますよね? アドレスの0番地とNULLは関係ないのでしょうか? よくわからないので教えてください。
- ベストアンサー
- C・C++・C#
- NULLポインタは0と書かなければだめ?
C++言語を使っています。 C++言語でNULLポインタを表す場合、0やNULLを使用しますが、 「NULLは単なるマクロなので本来は0を使わなければだめ」という話を聞きました。 つまり、 int *p = 0; が本当の正しいNULLポインタであり、 int *p = NULL; は推奨されていない(?)NULLポインタというようです。 今まであまり疑うことなく、NULLポインタを表すのにNULLを使用していましたが、 上記の内容は本当でしょうか。
- ベストアンサー
- C・C++・C#
- NULLポインタが0でない処理系とは?
http://okwave.jp/qa/q7458540.html にて、 > C言語の規格上、0はNULLポインタとして扱われますが > NULLポインタは0とは限らないので(0でない処理系もあります)。 と他の回答者が答えていたのが妙に引っかかりました。 後学のために知っておきたいのですが、 どの処理系だとNULLポインタが0ではないのかどなたかご存じないですか? 気になって、C99の仕様書らしいものを検索で見つけたのですが、 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf これによると、6.3.2.3 Pointers の 3節 にて、 > An integer constant expression with the value 0, > or such an expression cast to type void *, is called a null pointer constant. とあり、7.17 Common definitions <stddef.h> の 3節 でも、 > The macros are > NULL > which expands to an implementation-defined null pointer constant; (略) とあるので、NULLポインタを表す定数は0か(void*)0だと思っていたのですが。 言い換えると、 struct foo { char* bar; }; と構造体が定義されている時、 struct foo baz; bzero(&baz, sizeof(baz)); すればbaz.barはNULLポインタ定数に初期化されると思っていたのですが、 これだとダメな処理系はどういう処理系で、どんな用途で使うのでしょうか? おそらく、0でない値にした目的や歴史的経緯があるのではないかと推測するのですが。
- ベストアンサー
- C・C++・C#
- 配列のNULL初期化について
C言語についての課題の一部です。 int型の配列 iArrayをNULL初期化したいのですが、 課題では下のように書かれています。 &iArray[] = NULL; このような書き方でNULL初期化することは可能なのでしょうか?
- ベストアンサー
- C・C++・C#
- C++のNULLは意味があるの?
タイトルの通りです。 0で全て済むのに、わざわざNULLを使う必要が分かりませんし、私は全く使った事がありません。 ただ0と書くと数値かポインターかすぐには分からない からというのは、あまり対した理由にはなりそうも無いし。 ほかの人がNULLを使っているのをそのまま参考にしたと言うのが多いかもしれないですね。
- ベストアンサー
- C・C++・C#
- NULLとは?
NULLとは? ウインドウズライブメールのツール→アカウントを開くと 以下のようになっていますが、このか?Active Directory NULL (←薄いグレイの文字) とは何でしょうか? メール--------------- (絵)●●●●●●(既定のアカウント) ●▲●■●●nifty.com ニュース--------------- (絵)マイクロソフトコミュニティ(既定のアカウント) ディレクトリサービス--------------- (絵)Active Directory ★ NULL (←薄いグレイの文字) (絵)Veri Sign インターネットディレクトリサービス
- ベストアンサー
- ネットワーク
- #define NULL ((void *)0) の弊害
よく話題にされるヌルポインタについての疑問です。 定数の0は、それがポインタと解されるべき文脈では ヌルポインタに読み替えられますが、 可変長引数のようにポインタであることがコンパイラには判断できない文脈では、 明示的にキャストしてやらなければなりません。 このとき、#define NULL 0 と定義されている処理系では、 NULLを使っても定数の0を書いたのと全く同じであり、 上のような場合におけるキャストの必要性からは逃れられません。 しかし、たまたま自分の処理系で #define NULL ((void *)0) と定義されていれば、 キャストを行わなくてもNULLを使うことによって正しく動いてしまいます。 ということは、#define NULL ((void *)0) と定義された処理系しか 使ったことの無いプログラマは、 「NULLを使うこと自体が、これはポインタだよという意志表示になる」 と錯覚してしまう危険性をはらんでいることになります。 この人の書いた「NULLを使い、必要なキャストを省略しているソース」を、 #define NULL 0 と定義された処理系でコンパイルすると 正しく動作しない可能性があります。 こういう弊害があるにもかかわらず、 ANSI Cでは #define NULL 0 のほかに #define NULL ((void *)0) も許しているのは、 一体なぜなのでしょうか。 メリットもあるのでしょうか?
- ベストアンサー
- C・C++・C#
- (String)nullはnullではなく文字列?
引数として、(String)nullを渡しているコードがあるのですが、 これは「null」ではなく文字列としての「null」を渡しているのでしょうか? ・Stringでキャストしていると思うのですが、nullもキャストできるのでしょうか? ・それとも何か特別な意味がある?
- ベストアンサー
- Java
お礼
回答ありがとうございます。 解りやすいページを紹介してくださって、 ありがとうございます!