Poin yang sebagian besar jawaban di sini tidak membahas, setidaknya tidak secara eksplisit, adalah bahwa null pointer adalah nilai yang ada selama eksekusi, dan konstanta null pointer adalah konstruk sintaksis yang ada dalam kode sumber C.
Sebuah nol pointer konstan , sebagai jawaban Karlson ini benar menyatakan, bisa berupa konstan ekspresi bilangan bulat dengan nilai 0 (sederhana 0
adalah contoh yang paling umum), atau seperti cor ekspresi void*
(seperti (void*)0
).
NULL
adalah makro, didefinisikan dalam <stddef.h>
dan beberapa header standar lainnya, yang meluas ke konstanta penunjuk nol yang ditentukan implementasi . Ekspansi biasanya salah satu 0
atau ((void*)0)
(tanda kurung luar diperlukan untuk memenuhi aturan bahasa lainnya).
Jadi literal 0
, ketika digunakan dalam konteks yang membutuhkan ekspresi tipe pointer, selalu mengevaluasi ke null pointer
, yaitu nilai pointer unik yang menunjuk ke objek. Itu tidak menyiratkan apa pun tentang representasi dari pointer nol . Null pointer sangat umum direpresentasikan sebagai semua-bit-nol, tetapi mereka dapat direpresentasikan sebagai apa saja. Tetapi bahkan jika pointer nol direpresentasikan sebagai 0xDEADBEEF
, 0
atau (void*)0
masih merupakan pointer null konstan .
Jawaban ini untuk pertanyaan pada stackoverflow mencakup ini dengan baik.
Ini menyiratkan, antara lain, bahwa memset()
atau calloc()
, yang dapat mengatur wilayah memori ke semua-bit-nol, tidak akan selalu menetapkan pointer apa pun di wilayah itu menjadi null pointer. Mereka cenderung melakukannya pada sebagian besar implementasi, tetapi bahasa tidak menjaminnya.
Saya tidak tahu mengapa pertanyaan ini tidak dianggap sebagai duplikat dari pertanyaan ini , atau bagaimana topik ini di sini.