适才与朋友聊起了C++中NULL,由于他是搞OC的,对指针这块儿不是很理解,我就斗胆扯了一通我眼里的NULL给他听。结果自然是他没听懂,我没讲明白,所以回宿舍后我又与室友聊了一番。
千聊万聊,不如在编译器里跑一把。我打开了我的VS2015,跑什么呢?
得嘞,就从最简单的开始吧,
#include <iostream>
using namespace std;
int main()
{
int *p;
cout << p;
return 0;
}
不出意外,未经初始化的指针p,连编译都没法通过。当然,此时的指针p是一个野指针,无法使用。
那指针进行初始化了又是什么情况呢?
#include <iostream>
using namespace std;
int main()
{
int *p=NULL;
cout << p;
return 0;
}
可以,编译通过,跑起来了,指针的值还可以打印出来,是一串的0。显然,这里的NULL就是0(当然我是经过了一番查找资料)。
那么空指针的指针值为0,那么空指针的内存我们能调用吗?
#include <iostream>
using namespace std;
int main()
{
int *p=NULL;
cout << p;
cout << *p;
return 0;
}
代码很干脆的挂了,原因很简单,地址为0x000000000的内存不可访问。所以呢,我们可以这样理解,空指针实际上是指向的地址为0x0000的内存, 而这块内存又不允许我们进行访问。这与野指针是不一样的。
朋友又和我说了一个OOP中的问题,创建了一个类,类中有个成员变量是指针,但没有进行初始化,回事什么情况?
多说无益,跑一把便知
#include <iostream>
using namespace std;
class A
{
public:
int a = 0;
int *p;
};
int main()
{
A m;
cout << m.a << endl;
return 0;
}
这里很清楚的可以看到p的值编程了0x00000000,与我们给p赋值NULL的时候一样了。由此可见,当我们在使用类的时候,类里面的指针会自动被初始化为NULL,至于是编译器的功劳还是底层代码的实现,那还有待我进一步考证。
好了,关于NULL,我目前的理解也就是这样啦,更详细的内容可以参考:http://blog.youkuaiyun.com/fu_zk/article/details/21030607这篇文章进行了解。