在给函数提供原始变量时,最好的做法是:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
Run Code Online (Sandbox Code Playgroud)
要么:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
Run Code Online (Sandbox Code Playgroud)
IOW:有没有理由选择一个而不是另一个?
在C++的早期,当它被用螺栓固定在C之上时,你不能使用NULL,因为它被定义为(void*)0
.你不能将NULL分配给除了之外的任何指针void*
,这使得它变得毫无用处.在那些日子里,人们接受了你使用0
(零)空指针.
直到今天,我继续使用零作为空指针,但我周围的人坚持使用NULL
.我个人认为给NULL
现有值一个name()没有任何好处- 因为我也喜欢将指针测试为真值:
if (p && !q)
do_something();
Run Code Online (Sandbox Code Playgroud)
然后使用零更有意义(如果你使用NULL
,你不能逻辑使用p && !q
- 你需要明确比较NULL
,除非你假设NULL
是零,在这种情况下为什么使用NULL
).
有没有客观的理由偏好零而不是NULL(反之亦然),或者只是个人偏好?
编辑:我应该添加(并且最初要说)使用RAII和异常,我很少使用零/ NULL指针,但有时你确实需要它们.
我知道在C++中0x
或者NULL
被nullptr
基于指针的应用程序所取代.我只是好奇他们为什么要更换它?
在处理指针时,在什么情况下使用nullptr
过度NULL
有益?
在C++ 11中,nullptr
关键字被添加为更安全的类型指针常量,因为先前的通用定义NULL
为0有一些问题.
为什么标准委员会选择不调用新的空指针NULL
,或者声明NULL
应该是#define
d nullptr
?
我一直认为只会if(p != NULL){..}
做这项工作.但在阅读Stack Overflow问题后,似乎没有.
那么在吸收了那个说明NULL指针可能具有非零值的问题的所有讨论之后检查NULL指针的规范方法是什么?
我隐约记得几年前读过这篇文章,但我在网上找不到任何参考.
你能给我一个NULL宏没有扩展到0的例子吗?
编辑清晰:今天,它扩展为((void *)0)
,(0)
或(0L)
.但是,有些架构早已被遗忘,而这种情况并非如此,并且NULL扩展到了不同的地址.就像是
#ifdef UNIVAC
#define NULL (0xffff)
#endif
Run Code Online (Sandbox Code Playgroud)
我正在寻找这样一台机器的例子.
更新以解决问题:
我不是在现行标准的背景下提出这个问题,也不是用不正确的术语来扰乱人们.但是,我接受的答案证实了我的假设:
后来的模型使用了[blah],显然是对所有现存的写得不好的C代码的反应,这些代码做出了错误的假设.
有关当前标准中的空指针的讨论,请参阅此问题.
我不明白为什么下面的代码编译?
int main()
{
//int a = nullptr; // Doesn't Compile
//char b = nullptr; // Doesn't Compile
bool c = nullptr; // Compiles
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而评论部分没有.
这两个bool
和nullptr
是关键字,那么什么是关于其他数据类型的独特之处?
我需要能够区分NULL
和0
使用c ++.
有没有办法使用像===
运算符这样的东西(比如JavaScript中的标识运算符)来区分 c ++ NULL
和0
c ++ 之间的区别?
C#null合并运算符是否有C++等价物?我在代码中进行了太多的空检查.所以正在寻找一种减少空代码量的方法.
总结:nullptr
转换为bool
,bool
转换为int
,为什么不nullptr
转换为int
?
这段代码没问题:
void f(bool);
f(nullptr); // fine, nullptr converts to bool
Run Code Online (Sandbox Code Playgroud)
这没关系:
bool b;
int i(b); // fine, bool converts to int
Run Code Online (Sandbox Code Playgroud)
那么为什么这不行呢?
void f(int);
f(nullptr); // why not convert nullptr to bool, then bool to int?
Run Code Online (Sandbox Code Playgroud)