大多数情况下指针变量在栈上分配内存,编译器在分配变量的空间时只是简单移动栈的指针,这样在栈上声明多个变量就来得很快速,进行一次栈指针的移动就可以了,而再读写内存意味着效率将会损失,并且初始化的内容很快就会被改变
其实变量和指针,编译器都是平等对待的。VC中,全局变量初始化为0,全局指针初始化为NULL;局部变量(包括指针变量)如果未显式初始化,其值都是未定的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int
* a;
//编译器默认初始化为NULL
void
main()
{
int
* b;
//编译器不会默认初始化,并且编译时会出现一个警告
cout << a << endl;
//输出00000000
cout << b << endl;
//编译通过,但是运行时会出错,忽略该错误后输出CCCCCCCC(或其他很怪的值)
}code]
但即便编译器将全局指针初始化为NULL,又有什么用呢?如果不指向一个有意义的地址,还是非常不安全的。
以下代码能够编译通过,但运行时绝对会出错。
[code=C/C++]
int
* a;
void
main()
{
cout << a << endl;
cout << *a << endl;
//执行到该行时会出错
}
|