หมายเหตุ:คำตอบนี้ใช้กับภาษา C ไม่ใช่ C ++
ตัวชี้ Null
ตัวอักษรคงที่จำนวนเต็ม0
มีความหมายที่แตกต่างกันขึ้นอยู่กับบริบทที่ใช้ ในทุกกรณีมันยังคงเป็นค่าคงที่จำนวนเต็มด้วยค่า0
ซึ่งอธิบายไว้ในวิธีที่ต่างกัน
หากตัวชี้จะถูกเปรียบเทียบกับตัวอักษรคงที่0
นี่คือการตรวจสอบเพื่อดูว่าตัวชี้เป็นตัวชี้โมฆะ นี่0
จะเรียกว่าค่าคงที่ตัวชี้โมฆะ มาตรฐาน C กำหนดที่0
ส่งไปยังประเภทที่void *
เป็นทั้งตัวชี้โมฆะและค่าคงที่ตัวชี้โมฆะ
นอกจากจะช่วยให้การอ่านแมโครที่ระบุไว้ในส่วนหัวของแฟ้มNULL
stddef.h
ขึ้นอยู่กับคอมไพเลอร์ของคุณอาจเป็นไปได้#undef NULL
และกำหนดใหม่เป็นสิ่งที่แปลกประหลาด
ดังนั้นนี่คือวิธีที่ถูกต้องในการตรวจสอบตัวชี้โมฆะ:
if (pointer == NULL)
NULL
ถูกกำหนดให้เปรียบเทียบเท่ากับตัวชี้ null มันคือการใช้งานที่กำหนดสิ่งที่คำจำกัดความที่แท้จริงของNULL
คือตราบเท่าที่มันเป็นค่าคงที่ตัวชี้โมฆะที่ถูกต้อง
if (pointer == 0)
0
เป็นการแทนค่าคงตัวโมฆะตัวอื่น
if (!pointer)
if
คำสั่งนี้ตรวจสอบโดยนัยว่า "ไม่ใช่ 0" ดังนั้นเราจึงย้อนกลับไปที่ความหมาย "เป็น 0"
ต่อไปนี้เป็นวิธีที่ไม่ถูกต้องในการตรวจสอบตัวชี้โมฆะ:
int mynull = 0;
<some code>
if (pointer == mynull)
สำหรับคอมไพเลอร์นี่ไม่ใช่การตรวจสอบตัวชี้โมฆะ แต่เป็นการตรวจสอบความเท่าเทียมกันของตัวแปรสองตัว สิ่งนี้อาจใช้งานได้หาก mynull ไม่เคยเปลี่ยนรหัสและการปรับแต่งคอมไพเลอร์ให้คงที่เท่ากับ 0 ในคำสั่ง if แต่ไม่รับประกันและผู้แปลต้องสร้างข้อความวินิจฉัยอย่างน้อยหนึ่งข้อความ (คำเตือนหรือข้อผิดพลาด) ตามมาตรฐาน C
โปรดทราบว่าตัวชี้ null ในภาษา C คืออะไร มันไม่สำคัญกับสถาปัตยกรรมพื้นฐาน หากสถาปัตยกรรมพื้นฐานมีค่าตัวชี้โมฆะที่กำหนดเป็นที่อยู่ 0xDEADBEEF มันก็ขึ้นอยู่กับคอมไพเลอร์เพื่อเรียงลำดับความยุ่งเหยิงนี้
ดังนั้นแม้จะเป็นสถาปัตยกรรมที่ตลกวิธีการต่อไปนี้ยังคงเป็นวิธีที่ถูกต้องในการตรวจสอบตัวชี้โมฆะ:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
ต่อไปนี้เป็นวิธีที่ไม่ถูกต้องในการตรวจสอบตัวชี้โมฆะ:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
คอมไพเลอร์มองว่าเป็นการเปรียบเทียบปกติ
ตัวละคร Null
'\0'
ถูกกำหนดให้เป็นอักขระ null - นั่นคืออักขระที่มีบิตทั้งหมดตั้งค่าเป็นศูนย์ สิ่งนี้ไม่เกี่ยวกับพอยน์เตอร์ อย่างไรก็ตามคุณอาจเห็นบางสิ่งที่คล้ายกับรหัสนี้:
if (!*string_pointer)
ตรวจสอบว่าตัวชี้สตริงที่ชี้ไปที่ตัวละคร null
if (*string_pointer)
ตรวจสอบว่าตัวชี้สตริงที่ชี้ไปที่ตัวละครที่ไม่ใช่โมฆะ
อย่าสับสนกับพอยน์เตอร์พอยน์เตอร์เหล่านี้ เพียงเพราะการแสดงบิตเหมือนกันและสิ่งนี้ช่วยให้สะดวกในการข้ามกรณีพวกเขาไม่เหมือนกันจริงๆ
นอกจากนี้'\0'
คือ (เช่นตัวอักษรตัวอักษรทั้งหมด) ค่าคงที่จำนวนเต็มในกรณีนี้มีค่าเป็นศูนย์ ดังนั้น'\0'
จะเทียบเท่ากับ0
ค่าคงที่จำนวนเต็มที่ไม่มีการตกแต่ง- ความแตกต่างเพียงอย่างเดียวคือเจตนาที่สื่อถึงผู้อ่านที่เป็นมนุษย์
อ้างอิง
ดูคำถามที่ 5.3 ของ comp.lang.c คำถามที่พบบ่อยมาก ดูpdf นี้สำหรับมาตรฐาน C ดูที่หัวข้อ 6.3.2.3 พอยน์เตอร์, ย่อหน้าที่ 3.