【问题标题】:Is NULL a pointer?NULL 是指针吗?
【发布时间】:2021-03-12 18:07:13
【问题描述】:

所以,我之前和我的教授发生了争执,辩称 NULL 不是指针,但他一直坚持认为这是因为存在 NULL 指针这样的东西。所以,我现在有点困惑 NULL 是否真的是一个指针

我已经尝试通过互联网搜索,但找不到任何答案,所以我的最后一招就在这里

【问题讨论】:

  • 那么在给指针赋值 NULL 时你是怎么想的呢?它包含什么?
  • 这取决于“是指针”的含义。由于您标记了这个“概念”,我认为您可能在不同于正式语言定义的意义上使用术语“指针”。
  • @phuclv 指针指向空或零
  • 无指向的指针是空指针
  • @Joe:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。

标签: c pointers null conceptual concept


【解决方案1】:

NULL 本身不是指针,它是一个宏,可用于初始化指向其类型的 空指针 值的指针。与指针比较时,如果指针是 空指针,则比较相等,如果指针是指向其类型对象的有效指针,则比较不相等。

char *p = 0;char *p = NULL; 之间没有语义差异,但后者更明确,并且在另一个操作数不是明显指针或比较整数看起来像类型不匹配:

FILE *fp = fopen("myfile", "r");
if (fp == NULL) {
    /* report the error */
}

同样,'\0'0 在 C 语言中没有语义差异,它们都是 int 常量。第一个是空字节,第二个是空值。明智地使用0'\0'NULL 似乎是徒劳的,但也可以让其他程序员和自己更容易阅读代码。

混淆可能来自于将空指针拼错或误听为NULL指针。 C 标准经过仔细校对,仅使用 空指针 并将 NULL 仅作为宏 NULL 引用。

但请注意,NULL#define NULL ((void*)0) 的公认定义之一使 NULL 成为指向 void空指针

【讨论】:

    【解决方案2】:

    “指向地址 0 的指针”的想法没有任何问题。

    规则是不允许您取消引用它......它允许存在,并且如果创建将满足我能想到的任何“指针”标准。 只是因为它不是一个有意义的指针的东西......

    【讨论】:

      【解决方案3】:

      在 C 中,NULL 是一个扩展为空指针常量的宏。

      7.19p3

      宏是

      NULL 扩展为实现定义的空指针常量; ...

      空指针常量是一个整数常量表达式,其值为0 ( 例如,01-142*0LL 等)或这样的表达式转换为 (void*)

      6.3.2.3p3

      值为 0 的整数常量表达式,或这样的表达式 强制转换为 void * 类型,称为空指针常量。66) 如果为空 指针常量转换为指针类型,结果 指针,称为空指针,保证比较不等于 指向任何对象或函数的指针。

      大多数常见的 C 实现将 NULL 定义为 00L((void*)0)

      所以你正确的。 NULL 不必是指针。

      (IIRC,C++ 甚至不允许在NULL 中进行(void*) 强制转换,这意味着C++ 中的NULL 始终具有整数类型。正因为如此,并且因为void* 指针 不要在 C++ 中如此轻易地与常规指针进行比较,C++>=11 现在有一个特殊的 nullptr 关键字。)

      【讨论】:

      • @Joe 如果其中有(void *) 类型,那么它确实有(空)指针类型。
      • @Joe NULL 是一个扩展为非特定值的宏,该值可以与指针进行比较是否相等。 NULL 值可能是 void-pointer 类型,也可能是整数。通常是00L((void*)0)
      • @PSkocik 请注意,这个问题被标记为“概念”,而不是“语言律师”,所以我的猜测是,这个问题与其说是关于 NULL 宏,不如说是关于“空指针”作为一个概念。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多