当前位置: 首页 > 知识库问答 >
问题:

null指针不全为零时如何正确编写C/C++代码

姬宝
2023-03-14
void* p = get_some_pointer();
if (!p)
    return;

我应该写吗

void* p = get_some_pointer();
if (NULL == p)
    return;

而是为这样的架构做好准备,还是仅仅是我的偏执狂?

共有1个答案

卫念
2023-03-14

根据C规范:

值为0的整数常量表达式或转换为void*类型的表达式称为空指针常量。55)如果一个空指针常数被转换成一个指针类型,那么得到的指针(称为空指针)将被保证与指向任何对象或函数的指针不相等。

因此0是一个空指针常量。如果我们将它转换为指针类型,我们将得到一个空指针,对于某些体系结构来说,它可能是非全位零的。接下来让我们看看规范对比较指针和null指针常量有什么规定:

这意味着(!p)等价于(p==0),根据规范,这是针对机器定义的空指针常量测试p

因此,即使在null指针常量不是全位零的体系结构上,您也可以安全地编写if(!p)

对于C++,空指针常量定义为:

这导致0转换为指针类型(与C一样)。对于否定运算符:

逻辑否定运算符的操作数!根据上下文转换为bool(第4条);如果转换的操作数为true,则其值为true,否则为false。结果的类型是bool。

这意味着!p的结果取决于如何执行从指针到bool的转换。标准说:

 类似资料:
  • C++ 指针 在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。 NULL 指针是一个定义在标准库中的值为零的常量。请看下面的程序: #include <iostream> using namespace std; int main () { int *ptr = NULL; cout <<

  • 我有一个外国金融机构签名,我需要执行: FFI调用者需要提供一个缓冲区和该缓冲区的大小。Rust将向该缓冲区中填充一个字符串,最大值为,如果成功,则返回。FFI调用方应将字符串解释为ASCII。 鉴于我有一个

  • 在PowerShell中,可以定义C#代码并执行它。将$null传递到以下最简单的函数中,表明没有null传递到函数中 按如下方式调用它会导致输出 Not Null。是 “”。这表明$null在 C# 中不为空。像“是空的”或“是空的”这样的方法返回真值,因此PowerShell必须隐式地将$null转换为字符串。 了解为什么会发生这种情况,以及除了调用字符串之外是否有更好的解决方案。C#中的Is

  • 学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:#include <iostr

  • 主要内容:1. 指针是什么?,2. 如何使用指针?,3. Objective-C NULL指针,4. Objective-C指针详解Objective-C中的指针简单易学。使用指针可以更轻松地执行某些Objective-C编程任务,并且在不使用指针的情况下无法执行其他任务(如动态内存分配)。 所以有必要学习指向成为一个完美的Objective-C程序员。在这小节中将通过简单的步骤学习指针。 每个变量都是一个内存位置,每个内存位置都定义了它的地址,可以使用符号()运算符进行访问,该运算符表示内存中

  • 主要内容:this 到底是什么this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。 所谓当前对象,是指正在使用的对象。例如对于 ,stu 就是当前对象,this 就指向 stu。 下面是使用 this 的一个完整示例: 运行结果: 李华的年龄是16,成绩是96.5 this 只能用在类的内部,通过 this 可以访问类的所有成员,包括 private、protec