【发布时间】:2020-04-22 14:28:22
【问题描述】:
我一直在阅读 C++ Primer 5th edition。它提到了
将 int 变量赋值给指针是非法的,即使该变量的值恰好是 0。
我试了一下,结果如下:
int *u = 0; // success
int *w = 123; // fail
/* compile error:
ptr_test.cc:9:12: error: invalid conversion from 'int' to 'int*' [-fpermissive]
int *w = 123;
*/
int zero = 0;
int *v = zero; // fail
/* compile error
ptr_test.cc:9:12: error: invalid conversion from 'int' to 'int*' [-fpermissive]
int *w = zero;
*/
谁能帮我解释一下指针初始化的确切规则? 为什么将 int 指针分配给 0 很好,但 123 不行,尽管它们都是整数?为什么 123 会导致转换为 "*int" 而 0 不会?
顺便说一句,我使用的是 g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0。
【问题讨论】:
-
查看我提供的解释“类型转换”的链接。
-
接受 0 作为 null 是一种约定。当您尝试将
zero(=0)归因于*v时,也有一个例外。因为当编译器解析等于某个指针的0时,它们会将值评估为NULL。但是当您尝试使*v=zero时,编译器首先匹配变量的类型并找到一个是指针另一个是int(这不会发生在*v=0 上,因为0 被异常处理)。