使用未初始化的指针是非常危险的。通过一个未初始化的指针会很容易覆盖随机的内存区域。造成的损害取决于如何倒霉,所以初始化指针不仅仅是一个好主意。通过指向一个已经被定义变量的地址 很容易初始化一个指针。以下可以看到,通过使用运算符 & 及变量的名称来用变量number的地址对指针pnumber进行初始化:
int number = 0; // Initialized integer variable
int* pnumber = &number; // Initialized pointer
用另一个变量的地址初始化指针时, 请记住必须在指针声明之前声明该变量。
当然,可能不希望在声明指针时初始化为特定变量的地址。 在这种情况下可以将其初始化为等效为零的指针。为此,Visual c + + 提供了已定义为 0的符号 NULL,因此可以使用下面的语句声明并初始化一个指针,而不是上一个示例中那样:
int* pnumber = NULL; // Pointer not pointing to anything
这可以确保指针不包含一个有效的地址,并且给指针提供一个值,使可以在 if 语句中进行检查,例如:
if(pnumber == NULL)
cout << endl << “pnumber is null.”;
当然,也可以显式初始化为0,这也保证了它被分配一个值而不指向任何一个指针。没有对象可被分配到地址0,这样的效果是,0用作地址指针表明该指针没有目标。可以说它的清晰程度稍差,如果代码可能使用其他编译器,最好是将为空的指针初始化值为0。在ISO / ANSI C + +我会使用0而不是NULL来初始化一个指针变量。
这也更符合当前 ISO/ANSI c+ +的“好习惯”, 在C++中,如果一个对象有名字,那它应该有一个类型,但是,NULL并没有类型 — — 它是 0 的别名。 在以后,会发现在C + + / CLI中有点不同。
简单地以0对指针变量的进行初始化:
int* pnumber = 0; // Pointer not pointing to anything
使用以下语句来检查一个指针变量是否包含有效的地址:
if(pnumber == 0)
cout << endl << “pnumber is null.”;
以下语句也是等效的:
if(!pnumber)
cout << endl << “pnumber is null.”;
该语句和前边的例子是一样的,当然也可以这样:
if(pnumber != 0) // Pointer is valid, so do something useful
值为NULL的指针指向的地址指向一个垃圾值。不应该尝试解引用一个值为NULL的指针,这将导致程序立即中止。
Pointers to char 指向字符的指针
指向字符的指针类型 char* 有有趣的属性,它可以被文字字符串初始化。例如,使用以下语句声明和初始化一个指针变量:
char* proverb = “A miss is as good as a mile.”;
这看上去和初始化一个字符数组类似,但还是有一些不同的。
这将创建一个字符串(实际上是一个类型为const char的数组),包含字符串引号之间出现的字符以及用‘/0’终止,并将这段文本的地址存储在指针 proverb中。该文本的地址是它的第一个字符的地址。如下图所示:
|