Catatan: Jawaban ini berlaku untuk bahasa C, bukan C ++.
Null Pointers
Konstanta bilangan bulat konstan 0
memiliki arti yang berbeda tergantung pada konteks di mana ia digunakan. Dalam semua kasus, ini masih merupakan konstanta integer dengan nilai 0
, itu hanya dijelaskan dengan cara yang berbeda.
Jika sebuah pointer dibandingkan dengan konstanta literal 0
, maka ini adalah pemeriksaan untuk melihat apakah pointer tersebut adalah null pointer. Ini 0
kemudian disebut sebagai konstanta penunjuk nol. Standar C mendefinisikan yang 0
dilemparkan ke tipe void *
adalah pointer nol dan konstanta pointer nol.
Selain itu, untuk membantu keterbacaan, makro NULL
disediakan di file header stddef.h
. Bergantung pada kompiler Anda, dimungkinkan untuk #undef NULL
mendefinisikannya menjadi sesuatu yang aneh.
Oleh karena itu, berikut adalah beberapa cara yang valid untuk memeriksa pointer nol:
if (pointer == NULL)
NULL
didefinisikan untuk membandingkan sama dengan pointer nol. Ini adalah implementasi yang didefinisikan apa definisi sebenarnya NULL
, selama itu adalah konstanta penunjuk nol yang valid.
if (pointer == 0)
0
adalah representasi lain dari konstanta penunjuk nol.
if (!pointer)
if
Pernyataan ini secara implisit memeriksa "bukan 0", jadi kami membalikkan artinya "adalah 0".
Berikut ini adalah cara-cara INVALID untuk memeriksa pointer nol:
int mynull = 0;
<some code>
if (pointer == mynull)
Untuk kompiler ini bukan pemeriksaan untuk pointer nol, tetapi pemeriksaan kesetaraan pada dua variabel. Ini mungkin bekerja jika mynull tidak pernah mengubah kode dan konstanta optimisasi kompiler melipat 0 ke dalam pernyataan if, tetapi ini tidak dijamin dan kompiler harus menghasilkan setidaknya satu pesan diagnostik (peringatan atau kesalahan) sesuai dengan Standar C.
Perhatikan bahwa apa yang dimaksud dengan pointer nol dalam bahasa C. Tidak masalah pada arsitektur yang mendasarinya. Jika arsitektur yang mendasari memiliki nilai pointer nol yang didefinisikan sebagai alamat 0xDEADBEEF, maka terserah kompiler untuk menyelesaikan masalah ini.
Karena itu, bahkan pada arsitektur lucu ini, cara-cara berikut masih merupakan cara yang valid untuk memeriksa null pointer:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
Berikut ini adalah cara-cara INVALID untuk memeriksa pointer nol:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
karena ini dilihat oleh kompiler sebagai perbandingan normal.
Karakter kosong
'\0'
didefinisikan sebagai karakter nol - yaitu karakter dengan semua bit diatur ke nol. Ini tidak ada hubungannya dengan pointer. Namun Anda mungkin melihat sesuatu yang mirip dengan kode ini:
if (!*string_pointer)
memeriksa apakah penunjuk string menunjuk pada karakter nol
if (*string_pointer)
memeriksa apakah penunjuk string menunjuk pada karakter yang bukan nol
Jangan bingung dengan pointer nol. Hanya karena representasi bitnya sama, dan ini memungkinkan beberapa kasus cross over yang nyaman, mereka sebenarnya tidak sama.
Selain itu, '\0'
adalah (seperti semua literal karakter) konstanta integer, dalam hal ini dengan nilai nol. Jadi '\0'
benar-benar setara dengan 0
konstanta bilangan bulat tanpa hiasan - satu-satunya perbedaan adalah niat yang disampaikan kepada pembaca manusia ("Saya menggunakan ini sebagai karakter nol.").
Referensi
Lihat Pertanyaan 5.3 dari FAQ comp.lang.c untuk informasi lebih lanjut. Lihat pdf ini untuk standar C. Lihat bagian 6.3.2.3 Petunjuk, paragraf 3.