理解C++中的零和NULL
Understanding Zero and NULL in C++
在搜索应该使用Zero还是Null的答案时,我在SO上的另一个问题中遇到了这个问题,来自用户stroustup:
我应该使用NULL还是0?在C++中,NULL的定义是0,因此只是审美上的差异。我更喜欢避免使用宏,所以我使用0。NULL的另一个问题是人们有时会错误地相信它不同于0和/或不是整数。在预标准中代码,NULL有时被定义为不合适的内容因此不得不避免。现在这种情况不太常见了。
所以NULL和0是一样的,这很酷。但我需要更多的理解:假设我有以下内容(来自cprograming.com的一个随机示例):
struct node {
int x;
node *next;
};
int main()
{
node *root; // This won't change, or we would lose the list in memory
node *conductor; // This will point to each node as it traverses the list
root = new node; // Sets it to actually point to something
root->next = 0; // Otherwise it would not work well
root->x = 12;
conductor = root; // The conductor points to the first node
if ( conductor != 0 ) {
while ( conductor->next != 0)
conductor = conductor->next;
}
conductor->next = new node; // Creates a node at the end of the list
conductor = conductor->next; // Points to that node
conductor->next = 0; // Prevents it from going any further
conductor->x = 42;
}
以while ( conductor->next != 0)
线为例;我的理解是,内存中的那个点可能有以前使用过的垃圾值。当程序将其从使用中释放时,它将再次可用。那么,如何使用整数零作为值进行比较,以检查您是否已到达链表的末尾呢?你能保证垃圾值为零吗?为什么它不…只是一个随机的垃圾值?
那么,我的理解是完全偏离了,还是在前一个程序释放内存块的过程中,内存被重新归零了?在过去,我总是使用NULL,认为它是一个神奇的关键字,可以知道它是在寻找零还是垃圾值。然而,读到上面对别人问题的回答,我发现这不是真的。我为这样一个琐碎的问题道歉,但每次我在应用程序中与NULL或零进行比较以检查是否存在某种东西时,我都会感到困扰,因为它只是起作用,我不知道为什么。谢谢你给我带来的光明。
首先,Stroustrop不仅仅是"用户";他是C++语言的原作者和发明者。这句话出自他的一个常见问题。
在几乎所有的C和C++实现中,NULL只是0的#define(文本替换)。因此,的区别是纯粹的美学。
没有魔法。也许您没有理解"下一个"指针。它是下一个项目的地址,而不是项目本身。由于没有有效的指针0,所以它是一个方便的哨兵或标记,表示列表中没有下一个项目。如果一个节点被删除,则没有任何东西会自动将指向它的指针(即位于前一个节点中的下一个指针)设置回NULL/0。
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- 检查字符串是否"null" C++
- fopen 在 gdb 中返回 NULL
- what(): basic_string::_M_construct null not valid
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 为什么要从main()返回NULL?
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 是否有通用方法可以找到任何以 null 结尾的字符串的长度?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- 使用 curl_easy_cleanup(curl) 时收到未经处理的 NULL 异常
- ClassTemplateSpecializationDecl 的定义数据为 null