ここから本文です

C言語において、NULL と 0 と '\0' の違いは何ですか?

bur********さん

2008/10/219:22:30

C言語において、NULL と 0 と '\0' の違いは何ですか?

補足ここでいう 0 とは '0' (文字の 0 )ではなく数値の 0 です。
'0' はASCIIコードから 0x30 になるので違いが分かりやすいけど、自分の挙げた3つはどれも 0x00 のはずなので違いが分かりにくいんです。

閲覧数:
177,154
回答数:
6
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

tan********さん

編集あり2008/10/605:27:01

皆さん色々書いていますが,要は型が違うだけです。値はどれも同じです。
NULL ← void* 型
0 ← int 型
'\0' ← char 型

C言語では型の違いを意識することはあまりないけど,C++では重要になる
ことがあります。

それから,C++ではNULLがint型になっています。
理由を聞いた事があるけど…,忘れてしまったww

(追記)
>petit_saintさん

>となると、0と'\0'の違いは、int型で「0」を表す場合に0、
>char型で「0」を表す場合に\0(終端を意味する)となりますね。
ふふふ。
この辺りは,C言語を勉強したての頃は,間違えやすいですよね。
この場合はあまり深く考え無くても,単純に型が違うという
ことでOKです。

>C言語でも型の意識はしますよ。とても。浮動小数点演算するときにintでやりませんよね?
言葉足らずでした。確かに浮動小数点か整数型かは明確に
意識しますね。
言いたかったのは,C++ よりも意識する頻度が少ないということです。
意識することが全く無いということではありません。

それから,C++でNULLがint型になっている件については,以下の
URLに記載されていました。
http://ja.wikibooks.org/wiki/More_C++_Idioms/nullptr

(一部記載漏れたので,再追記)
>あと、値は違いますよ。というか「値」というくくり方ができないですよ。
>NULLは、アドレスが0。
書き忘れたけど,C言語の場合でもNULL の値は0だよ。
もちろん,NULLはvoid*型なので,数値ではないけどね。

アドレスに格納されるのがどうのと書いているけど,たとえば,
void**型の変数があって,そのポインタの指す領域に
NULLを代入したら,メモリには0x00000000が格納されるよね?

*(int*型の変数) = 0; ← メモリには,0x00000000が代入される。
*(char*型の変数) = '\0'; ← メモリには,0x00が代入される。
*(void**型の変数) = NULL; ← メモリには,0x00000000が代入される。

質問した人からのコメント

2008/10/8 20:01:52

ありがとうございました。

「null 0」の検索結果

検索結果をもっと見る

ベストアンサー以外の回答

1〜5件/5件中

並び替え:回答日時の
新しい順
|古い順

pet********さん

編集あり2008/10/521:26:42

ss_xxzzさんのご指摘が的確だと思います。
NULLは、stdio.hで
#define NULL ((void*)0) で定義されていませんでしたっけ?

追記
>tanak_muさん
C++では、NULLは0として定義されているようですね。
C言語でも型の意識はしますよ。とても。浮動小数点演算するときにintでやりませんよね?
あと、値は違いますよ。というか「値」というくくり方ができないですよ。
0は、0を示すアドレスの値が0x30。
\0は\0を示すアドレスの値が0x00。
NULLは、アドレスが0。

再追記
↑あ、自分、間違ってました。
0は、0を示すアドレスの値が0x00ですね。
となると、0と'\0'の違いは、int型で「0」を表す場合に0、
char型で「0」を表す場合に\0(終端を意味する)となりますね。

ss_********さん

2008/10/306:34:50

無効なアドレスと数字のゼロと文字の違い。
同じだなんてとんでもない。

アバター

ID非公開さん

編集あり2008/10/401:16:03

表現上の違いとお考えください。
ポインタなどに空のアドレスを設定する場合は NULL。
整数など、数値に値を代入するような場合は 0。
Char など、1バイトを表現する場合は '\0'。

実際には、どれもゼロなのですが、
使う型によって意味合いが異なりますので、それぞれ使い分けます。

NULL は C言語においてはキーワードではなく、
#define NULL 0
と定義されているだけです。
コンパイル時には NULL も 0 に置き換えられ、
コンパイラが文脈の中で解釈した型の 0 として処理されます。

'\0' は、1バイトの 0 を意味しているだけで、
これもまた 0 です。

型と意味合いによって使い分けるため、とお考えください。
これは、読みやすいコーディングをする上で大切な習慣です。

----------

追伸: C++ではなく、Cでしたね。少々早合点してしまいました。

VC++では、WinDef.h に次のように定義されています。

#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif

Cでは (void *)0、すなわちアドレスを意識していますが、
C++では 0 だということを現しています。

使い分けについては先に説明したとおりにしていれば、
CでもC++でも違いは出てきません。

rhi********さん

2008/10/221:02:45

/*
0 vs '\0' の実体と機能の比較(等価)実証です
'\0'を使う理由は、ソース上でその役割を明示するため
という事になります。
*/

#include <stdio.h>

int main(){
char *chs="ABCDEFGHK";

printf("\\0 by %%d, %%X = ");
printf("%d %X\n",'\0','\0');
printf(" 0 by %%d, %%X = ");
printf("%d %X\n",0,0);
printf("\n");
printf("chs=%s\n",chs);
printf("*(chs+7) = '\\0';\n");
*(chs+7) = 0;
printf("chs=%s\n",chs);
printf("*(chs+4) = 0;\n");
*(chs+4) = 0;
printf("chs=%s\n",chs);
return 0;
}
/* 出力:
\0 by %d, %X = 0 0
0 by %d, %X = 0 0

chs=ABCDEFGHK
*(chs+7) = '\0';
chs=ABCDEFG
*(chs+4) = 0;
chs=ABCD
*/

arg********さん

2008/10/220:55:11

どれもゼロ、つまり「何も入っていない」ということを表すのに使います。

『0』は「0という数字」、つまり「数字が空」です。
しかし、「char a ='0';」とするとaに「0という文字」が入ってしい『0』が「空」という意味に使えないので「文字が空」というのを表したいときは『'¥0'』を使います。
同様に、「ポインタが空」を表したい場合には『NULL』を使います。

そんな感じだったと思います。

http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide50-1.html

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる