指针使用前应先初始化

  • Post author:
  • Post category:其他


使用未初始化的指针是非常危险的。通过一个未初始化的指针会很容易覆盖随机的内存区域。造成的损害取决于如何倒霉,所以初始化指针不仅仅是一个好主意。通过指向一个已经被定义变量的地址 很容易初始化一个指针。以下可以看到,通过使用运算符 & 及变量的名称来用变量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中。该文本的地址是它的第一个字符的地址。如下图所示: