指针的初始化

来源:互联网 发布:闲鱼申请淘宝介入15天 编辑:程序博客网 时间:2024/06/05 03:44

 

指针和其他类型变量不同的是它有“两种”地址。由于指针仍然是变量,所以系统会分配一块内存,这块内存有一个地址,记住这个地址是系统分配的,不会出错。当然如果将这个地址存放在另一块内存中,那么就是双重指针了。另外,指针的特殊之处在,指针变量也是表示的地址,我们可以通过这个地址来访问其他变量,叫做间接访问。指针的初始化,就是讨论指针变量“这块内存”的赋初值问题。

第一个问题,为什么要进行初始化

  • 养成好的习惯,将每一个变量都进行初始化,让每一个变量都在自己的掌控之中;没有初始化的指针会导致严重后果,例如

void change(int *x, int *y)

{

int *temp;

*temp = *x;

*x = *y;

*y = *temp;

}

  •  定义了一个指针p,它指向的变量为int型。如果是AUTO类型的,那么p的值会是一个的随机值,那么,这一个以这个随机值为地址的内存可能是不可访问的,系统就会报错;更可怕的是,这个随机值指向的地址是可以访问的,那么*p就会是一个错误的值,而程序在运行,就会得到错误的结果,这种错误是十分隐蔽的。

第二个问题,如何对指针进行初始化

有两个方法

  • 第一种是确保指针是指向可访问的内存区域,并且该内存存放的内容是知道的。

int a = 0;

int *p = &a;

由于系统会自动在可访问的区域定义a,所以&a一定是可访问的,同时可以知道*p = 0。但这种方法有点麻烦。

  • 第二种是“以毒攻毒”。

int *p = NULL;

系统定义NULL其实就是0,但是表示指针是一般用NULL。0这块地址是不可访问的,所以如果用到*p就会出错,让错误暴露出来而不是隐含在程序中,这就迫使在使用*p之前先对它正确地赋值。所以比较好的风格是在使用指针之前先检查一下

if(p == NULL)

或者

assert(!p);