CPP11新特性——指针空值nullptr

C++98中的指针空值

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本就是按照如下方式对其进行初始化:

void TestPtr()
{
	int* p1 = NULL;
	int* p2 = 0;

	// ......
}

NULL实际是一个宏,在传统的C头文件(stdef.h)中,可以看到如下代码:

#ifdef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void*)0)
#endif
#endif

可以看到,*NULL可以被定义为字面常量0,或者被定义为无类型指针(void)的常量。**不论采用何种定义,在使用空指针时,都不可避免的会遇到一些麻烦,比如:

void f(int)
{
	cout << "f(int)" << endl;
}

void f(int*)
{
	cout << "f(int*)" << endl;
}

int main()
{
	f(0);
	f(NULL);
	f((int*)NULL);
	return 0;
}

程序本意时想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整型常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0.
注意:
1.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
2.在C++11中,sizeof(nullptr)与sizeof((void*)0)所占的字节数相同。
3.为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go 中,结构体类型是值类型。当我们将一个结构体变量传递给一个函数时,实际上传递的是这个结构体变量的副本。如果我们希望在函数内部修改原始结构体变量的值,我们可以将这个结构体变量的指针作为函数参数传递。 例如: ``` package main import "fmt" type Person struct { Name string Age int } func main() { p := Person{Name: "Tom", Age: 18} fmt.Println(p) // 输出 {Tom 18} modify(&p) fmt.Println(p) // 输出 {Jerry 20} } func modify(p *Person) { p.Name = "Jerry" p.Age = 20 } ``` 在上面的例子中,我们定义了一个 `Person` 结构体类型,并创建了一个 `Person` 类型的变量 `p`。然后我们将 `p` 的地址传递给 `modify` 函数,函数内部通过指针修改了原始结构体变量的值,最终输出结果为 `{Jerry 20}`。 需要注意的是,如果我们将一个空结构体变量的指针传递给函数,并试图在函数内部修改它的字段值,会导致运行时错误。这是因为空结构体变量的内存地址是 nil,无法进行字段值的修改。因此,在处理空结构体变量时,我们需要特别小心。 例如: ``` package main import "fmt" type Person struct { Name string Age int } func main() { var p *Person fmt.Println(p) // 输出 <nil> modify(p) fmt.Println(p) // 输出 <nil> } func modify(p *Person) { p.Name = "Jerry" // 运行时错误:panic: runtime error: invalid memory address or nil pointer dereference p.Age = 20 } ``` 在上面的例子中,我们定义了一个空的 `Person` 结构体指针 `p`,并将其传递给 `modify` 函数。由于 `p` 的值为 nil,试图在函数内部修改它的字段值会导致运行时错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值