• ベストアンサー

C++のNULLは意味があるの?

toysmithの回答

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.6

まず理解しなくてはいけないのは「C,C++には組み込み定数が存在せず、NULLはプリプロセッサシンボルでしかない」ということです。 プリプロセッサがプリプロセッサシンボルを値に変換するときに文法を意識することを期待できません。 ANSI以前のCではNULL=0というのはUNIXにおける慣例にすぎず、NULLで示される無効ポインタは0という保証はありませんでした。 またint16ビット、アドレス32bitのコンパイラではNULLは0Lである必要がありました。 移植性の観点から無効ポインタを0と記述することは問題がありました。 しかし、32bitアドレスと16ビットアドレスを使い分ける必要のある場合などは「何が何でも向こうポインタはNULL」と考えると問題が発生する場合があります。 C/C++ではアドレス値の形式は処理系依存なので(char *)0とか(long *)0のように明示的なキャストを伴う値を使った方が移植性は向上します。

関連するQ&A

  • Cで言うNULLは「C++では0をリテラルとする」みたいな事を、

    Cで言うNULLは「C++では0をリテラルとする」みたいな事を、 どこかで昔、読んだのですが今でもそうでしょうか? (Cの場合、厳密にはdefine定義でNULLとしている(た)のでしょうが…) 最近のCとC++の言語仕様に詳しい方、お願いします。 気分的にはC++の場合、自分はポインタ初期化を0で行う事が好きなので、 他の人はどうしてるんだろうと、気になった所から生まれた疑問です。 //例:↓ClassXのコンストラクタの実装 ClassX::ClassX(void) :mPtr(0) { } }

  • #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) も許しているのは、 一体なぜなのでしょうか。 メリットもあるのでしょうか?

  • nullの概念

    nullの3つの概念と言われる、空文字、空ポインタ、空文の意味と必要性がいまいちわかりません。 ご存じの方ぜひ教えてください。

  • NULL値をゼロとして扱うには?

    JavaScriptでNULL値をゼロとして扱いたいのですが、"parseFloat"や"eval"などで変換してもはゼロ数値として扱ってくれません。やはり、"NaN"や"Undefined"かどうか判断して、そうであった場合は"0"に変換するというステップが必要なのでしょうか? なんかスムーズじゃなくて納得できません。

  • C言語の勉強中です

    C言語の勉強中です。自分の参考にしている本でよくわからないところがあったので教えてください 本には、NULLポインタは、すべてのビットが0であり、どこのアドレスも指さないポインタのことと書いてあるのですが、アドレスは0から始まるから、実際はアドレスの0番地を指していますよね? どこのアドレスも指さないと言いつつ、実際は0番地を指しているあたりがよくわかりないので教えてください

  • Accessで値がnullの場合は計算せずにnullをかえす方法

    Accessについて、教えてください。 クエリで抽出しているときに、フィールド1とフィールド2の数値を掛け算した値をフィールド3に表示したいと思っています。(小数点1位まで表示) フィールド1とフィールド2は値がnullの場合もありますが、この場合は「0」として扱うのではなく、そのまま計算結果もnullにしたいと思っています。 最初は単純に フィールド3: ROUNDMS2(ROUNDMS([フィールド1],1)*ROUNDMS([フィールド2],1),1) とクエリに表記したのですが、この場合「フィールド1」や「フィールド2」がnullの場合は#ERRORが表示されました。 次に、IFでフィールド1やフィールド2がnullの場合は計算せずにnullをかえしてもらおうと下記のような文をつくりました。 フィールド3: IIf([フィールド1]=Null,Null,IIf([フィールド2]=Null,Null,ROUNDMS2(ROUNDMS([フィールド1],1)*ROUNDMS([フィールド2],1),1))) これでもやっぱり#ERRORが表示されます。 いろいろと検索したのですが、nullを0として扱う例は多数見つけられましたがnullのまま扱う例が見つけられませんでした。 勘違いしているところがあるかもしれませんが、アドバイスよろしくお願いいたします。

  • 「NULLポインタ」と「演算の結果としてのアドレス0」との比較

    ものすごく基本的な疑問です。。。 「C言語FAQ日本語訳」http://www.kouno.jp/home/c_faq/ ここの「05.ヌルポインター」を見ると以下のような意味の記述があります。 「NULLポインタは他のどんなポインタの値とも区別可能で、有効なポインタと比較しても等しくなる事はない」 「ポインタを書くべき場所に書かれた定数0はコンパイル時にNULLポインタに変換される」 そこで以下のプログラムを Borland C++ 5.5 for Win32 でコンパイル・実行してみたところ、 p1 == p2 とりました。これって変ですよね? p1 は明示的に定数0で初期化しているのでNULLポインタですが、p2 は演算の結果としてアドレス0番地を指しているので、NULLポインタでは無いですよね? これはコンパイラが間違っていると思って良いのでしょうか? #include <stdio.h> int main() { char *p1,*p2; p1 = 0; p2 = (char *)1; p2--; if(p1 == p2){ printf("p1 == p2"); } else{ printf("p1 != p2"); } return 0; }

  • フォームを開くときのwhere条件式でnull値のものに絞りたい

    VBAの記述で、フォームを開くときにレコードの抽出条件を指定できますが、その際,指定したフィールドの値がNullのもの、逆にNullLでないものという条件の与え方はできないのでしょうか? 値がある文字列と等しいとかある数値や日付以上といった条件式はヘルプでみるのですが、NullかNullでないといった判断をさせる条件式が参考書等でもみあたらないのですが。  それとも何か違うやりかたがあるのでしょうか?ご存知のかたは教えてください。

  • データベースのINT型項目にNULLはNG?

    以前、知り合いからデータベースのINT型の項目には出来ればNULLを許可しない(NOT NULL)方がいいと聞いたことがあるのですが、本当でしょうか? 現在不動産の物件データを登録するためのシステムを作成しており、 データベースの設計を行なっている最中なのですが、 例えば金額や面積など数字しか入力されない項目はINT型にしたいと考えています。 ※データベースはMySQLになります。 ただし、 物件データ登録時に数字項目に何も入力されなければ「NULL」、 0以上の数値を入力されている場合にはそのままその数値をデータベースに登録したいと考えています。 ※0を入力されている場合には「0」をそのまま入れたいです。 INT型の項目にはNULLを入れるのを避けた方がいい場合には、0を入れるような仕様に変更しようと考えているのですが、その辺のことについて教えて頂けると助かります。 ざっくりとした質問で申し訳ございませんが、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • テキストデータでNULL?

    こんにちは。会社の人がテキストエディタでファイルを開いて、このデータはNULLが入っているからおかしいとかブツブツ言っていました。 データの中身はバイナリデータではなく、固定長、またはCSVファイルのような事を言っていました。 そこで疑問に思ったのですが、固定長、またはCSVでNULLなんてあるんでしょうか?たぶん、空文字列の事をさしてNULLと言っているような気がするのですが、テキストデータにNULLは存在するのでしょうか?