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
Bài liên quan
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ònnull
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.Bạn có thể hiểu đơn giản,
NULL
là cách quy ước hay cơ chế củaC
giúp ta kiểm tra xem con trỏ là hợp lệ hay không. Còn giá trị củaNULL
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/
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
stddef.h
source code: GitHubNUL
là ký tự đặc biệt có giá trị 0, cònNULL
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.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
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:
bạn muốn nói là NULL = 0 ?
*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.