指针的初始化 (2012-02-26 18:20:20)转载▼
标签: 杂谈 分类: C语言
指针和其他类型变量不同的是它有“两种”地址。由于指针仍然是变量,所以系统会分配一块内存,这块内存有一个地址,记住这个地址是系统分配的,不会出错。当然如果将这个地址存放在另一块内存中,那么就是双重指针了。另外,指针的特殊之处在,指针变量也是表示的地址,我们可以通过这个地址来访问其他变量,叫做间接访问。指针的初始化,就是讨论指针变量“这块内存”的赋初值问题。
第一个问题,为什么要进行初始化
养成好的习惯,将每一个变量都进行初始化,让每一个变量都在自己的掌控之中;没有初始化的指针会导致严重后果,例如
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);
标签: 杂谈 分类: C语言
指针和其他类型变量不同的是它有“两种”地址。由于指针仍然是变量,所以系统会分配一块内存,这块内存有一个地址,记住这个地址是系统分配的,不会出错。当然如果将这个地址存放在另一块内存中,那么就是双重指针了。另外,指针的特殊之处在,指针变量也是表示的地址,我们可以通过这个地址来访问其他变量,叫做间接访问。指针的初始化,就是讨论指针变量“这块内存”的赋初值问题。
第一个问题,为什么要进行初始化
养成好的习惯,将每一个变量都进行初始化,让每一个变量都在自己的掌控之中;没有初始化的指针会导致严重后果,例如
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);