01/10/2018, 16:09

NULL là gì, con trỏ trỏ tới NULL là trỏ tới đâu?

sau một hồi search hùng hục em thấy có hai luông ý kiến thế này

  • NULL được define là 0 ,con trỏ gán bằng NULL sẽ trỏ vể ô nhớ có địa chỉ 0 và = 0 giống = NULL. Nếu vậy thì define NULL 0 làm cái *** gì.
  • NULL khác 0, NULL = (void*)0, khi ta gán con trỏ bằng NULL nó sẽ không trỏ vào đâu cả. Nếu vậy lúc này con trỏ sẽ nhận giá trị là bao nhiêu
    em càng search càng thấy rối, mong các bác thông não giùm
viết 18:18 ngày 01/10/2018

gán NULL cho con trỏ nghĩa là con trỏ đó ko trỏ tới vùng nhớ nào cả. Em thấy khó hiểu cũng đúng. Giống như số 0 ấy, người La Mã ko có chữ cái cho số 0 vì 0 nghĩa là ko có gì cả làm sao thể hiện nó được? Người châu Âu cũng phải vay mượn từ dân Ả Rập mới có số 0. Tương tự con trỏ cũng vậy, ko trỏ tới cái gì thì giá trị của nó sẽ là gì? C cho NULL là 0, nhưng thực chất NULL ko phải là số nguyên 0, vì 0 là số nguyên, còn NULL là con trỏ, hơn nữa nó là con trỏ đặc biệt ko trỏ tới đâu cả.

C++11 thì có nullptr, là giá trị của con trỏ khi nó ko trỏ tới đâu hết. nullptr có kiểu giá trị là nullptr_t, là kiểu con trỏ ko trỏ tới đâu cả. Kiểu này chỉ có 1 giá trị duy nhất là nullptr. Nhiều ngôn ngữ khác cũng xác định kiểu mà chỉ có 1 giá trị duy nhất là cho con trỏ đặc biệt này. Nói vậy để em thấy NULL/null/nil/nullptr là 1 giá trị rất đặc biệt.

C/C++ coi NULL/nullptr là false, do kiểu con trỏ có thể ép kiểu thành boolean. Đây có thể là 1 sai lầm của C/C++. Trong các ngôn ngữ hướng đối tượng khác như Java/C# thì null ko phải là false. false nghĩa là giá trị “sai”, còn null là ko có đối tượng nào cả, nên ko thể so sánh cái có thật với cái hư vô được.

Pham Van Hai viết 18:12 ngày 01/10/2018

Bạn có thể hiểu đơn giản, NULL là cách quy ước hay cơ chế của C giúp ta kiểm tra xem con trỏ là hợp lệ hay không. Còn giá trị của NULL theo mình không quá quan trọng lắm với người dùng ngôn ngữ.
Bạn có thể nghiên cứu danh sách câu hỏi và trả lời này:
http://c-faq.com/null/

Trần Hoàn viết 18:11 ngày 01/10/2018

C nó chưa hoàn thiện lắm, chưa có một khái niệm NULL hoàn chỉnh như các ngôn ngữ về sau

Hung viết 18:25 ngày 01/10/2018
#if defined (_STDDEF_H) || defined (__need_NULL)
#undef NULL		/* in case <stdio.h> has defined it. */
#ifdef __GNUG__
#define NULL __null
#else   /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
#else   /* C++ */
#define NULL 0
#endif  /* C++ */
#endif  /* G++ */
#endif	/* NULL not defined and <stddef.h> or need NULL.  */
#undef	__need_NULL

stddef.h source code: GitHub

rogp10 viết 18:26 ngày 01/10/2018

con trỏ gán bằng NUL sẽ trỏ vể ô nhớ có địa chỉ 0 và = 0 giống = NULL.

NULký tự đặc biệt có giá trị 0, còn NULL là hằng địa chỉ có giá trị tùy vào môi trường, nên không thể sử dụng thay cho nhau.

newbie viết 18:22 ngày 01/10/2018

cái đấy là do em đánh sai thôi, em sửa lại rồi, cảm ơn anh chỉ cho e chỗ sai

Tao Không Ngu. viết 18:13 ngày 01/10/2018

Hi newbie.
Theo mình nó xuất phát từ nhu cầu kiểm tra con trỏ được cấp phát hay chưa. Giải pháp đơn giản nếu nó chưa được cấp phát thì gán nó bằng một giá trị cố định không bao giờ dùng đến để kiểm tra.
NULL (0 trong C) là một lựa chọn hoàn hảo:

  1. Không bao giờ cấp phát vào ô nhớ địa chỉ 0.
  2. Đễ dàng kiểm tra :
if(!poiter) {
    poiter = new ...
}
newbie viết 18:10 ngày 01/10/2018

bạn muốn nói là NULL = 0 ?

rogp10 viết 18:11 ngày 01/10/2018

*oops* gần đúng, NULL là (void*) 0, theo 6.3.2.3 mục 3:

[quote]An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant. If a null pointer constant is converted to a
pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal
to a pointer to any object or function.[/quote]

0 này là của người lập trình, còn trình dịch sẽ thay đổi cho phù hợp với máy khi biên dịch.

Bài liên quan
0