• ベストアンサー

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

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

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

  • ベストアンサー
回答No.1

C++では 0 です。 さらに次期C++規格(C++0X)では nullptr が導入されます。 void* p = NULL; // C void* p = 0; // C++ void* p = nullptr; // C++0X

iararase
質問者

お礼

ベストです!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • #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ポインタが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でない値にした目的や歴史的経緯があるのではないかと推測するのですが。

  • NULLポインタは0と書かなければだめ?

    C++言語を使っています。 C++言語でNULLポインタを表す場合、0やNULLを使用しますが、 「NULLは単なるマクロなので本来は0を使わなければだめ」という話を聞きました。 つまり、 int *p = 0; が本当の正しいNULLポインタであり、 int *p = NULL; は推奨されていない(?)NULLポインタというようです。 今まであまり疑うことなく、NULLポインタを表すのにNULLを使用していましたが、 上記の内容は本当でしょうか。

  • C#のnull許容の警告について

    「Visual Studio」のNET6.0の環境でコードを書いています。 static string UserName; という変数の宣言に対して 「null非許容のフィールドUserNameには、コンストラクターの終了時にnull以外の値が入っていなければなりません。フィールドをNULL許容として宣言することをご検討ください。」 という警告を回避するために static string? UserName; というnull条件演算子で対応したのですが、上司に 「トリッキーな方法(?)ではなく、初期化や代入を使え」 と言われてしまい static string UserName = null ; という書き方を試したのですが 「nullリテラルをnull非許容参照型に変換できません」 という警告が出てしまい、警告を出さない書き方が分からず困っている状態です。 どなたか修正方法を教えて頂けないでしょうか? 【ソースコード】 static class Program { static string UserName; static void Name() { Console.WriteLine("ユーザ名を入力してください"); string? enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); UserName = enterName; } 以下省略

  • C言語のNULLについて

    C言語のNULLについて教えてください。 ・NULLは、アドレスの0番地であり、参照先が無い(どこのメモリ箇所も指していない)と  言う認識でいます。 そこで、仮に下記の処理を行った場合どうなるか試してみました。 ------------------------------------------ stddef.h (void *)0) ------------------------------------------ char *test; test = NULL; printf("[%p]\n", test); // 出力 [00000000] printf("[%s]\n", test); // 出力 [] memcpy(test, "123", 3); // メモリフォルト ------------------------------------------ 予想としては、%sの処理でメモリフォルトとなると思っていたのですが 実際は、メモリフォルトが起こらなかったです。 と言う事は参照先が何かしらあったって事なのでしょうか?

  • NULLで初期化

    C言語で char name[256]; のnameをNULLで初期化する場合どういう記述になりますか。

  • NULL領域を読み書きするの意味が?

    C言語の初学者です。 コンパイラは、Borland C++ 5.5.1 for Win32 を使っています。 たまたま見つけた C magazine プログラミングの禁じ手Web版 C言語編で、「NULL領域を読み書きする」という個所があり、下記ソースで発覚すると掲載されていました。 (http://www.cmagazine.jp/src/kinjite/c/null.html#index5) void f() { static char *theTxt; strcpy(theTxt,"TEST\n"); printf("%s",theTxt); } 自分の環境で、下記のソースで動かしてみたところ、アプリケーションエラーになりました。 #include <stdio.h> #include <string.h> int main(void) { static char *theTxt; /* (1) */ strcpy(theTxt,"TEST\n"); printf("%s",theTxt); return 0; } この禁じ手の意味そのものが、全く理解できませんでした。 ・NULL領域というのは、(1)のstatic定義されたポインタことをさしているのか? ・(1)の static をつけないで実行すると、正常終了したので、static の領域に書き込んではいけないのか? (そんなことはないと思うのだが)

  • c#のマクロ定義について

    C言語でマクロ定義の場合以下のようにヘッダファイルに#defineで定義しますが、C#の場合どのようにすればいいのでしょうか。 C言語の場合 *** test.h *** #define TEST 5 C#の場合 public const int TEST = 5; //これでいいの? 専用のclassを用意するの? 初歩的な質問ですが宜しくお願い致します。

  • 配列のNULL初期化について

    C言語についての課題の一部です。 int型の配列 iArrayをNULL初期化したいのですが、 課題では下のように書かれています。 &iArray[] = NULL; このような書き方でNULL初期化することは可能なのでしょうか?

  • C言語:void*の指す型の比較をする方法

    C言語において、Java言語で言うところのinstanceof演算子の様な、方の比較をする演算子、もしくは、その方法をご存知でしたら教えていただきたく思います。つまり、   void型のポインタ変数x   void *x = (何とかのアドレス); となっている時、xの指す型・構造体を知りたいのです。 問題の解決方法・アドヴァイスを宜しくお願いします。 私は現在 void *function(..., ...); という関数を作り、それは処理に応じて,A構造体へのポインタ、B構造体へのポインタ又は、NULLを返します。そして、 void *tmp = function(..., ...); を作りました。tmpがAを指している時、Bを指している時、NULLとなっている時、それぞれに合わせて異なった処理をしたく思っています。そのためには、tmpがどの構造体又は、NULLを指しているのかが分からないといけません。その方法が分からず困っています。

このQ&Aのポイント
  • p-touch cube PT-P710BTを使用して印刷ボタンを押すと、「このアプリケーションでは対応していないカセットです。」という表示が出ます。
  • 他のデバイスやカセットでも同じ表示が出るため、問題はp-touch cube PT-P710BTにある可能性があります。
  • お使いの環境はiPhone Xおよび11で、無線LAN経由で接続されています。関連するソフトはbrother p-touch Design & print 2です。
回答を見る