在使用指针时如果出现了错误,第一步我们首先检查指针是否正确的进行了初始化。指针总是指向一个地址的,因此在检查初始化是否正确的时候,
可以关注一下,“=”号的右边是不是一个地址。
指针的初始化主要有两大类方法:
一是给指针变量初始化一个在内存中已经存在的地址;二是通过指针变量申请一块新的内存并赋初值。
接下来从几个方面来详细列出:
一是给指针变量初始化一个在内存中已经存在的地址,常用的有以下几种方法:
1.变量的地址:
int a = 10;
int * p = NULL;
p = &a;
这两句等价于 int * p = &a;
2.地址常量
将指针常量赋给一个指针
如:long p = (long)(unsigned long)0xfffffff0;
3.数组的地址
char ary[100];
char *cp = ary;
4.字符串常量
char *cp = “abcdefg”;
对于一个不确定要指向何种类型的指针,在定义它之后最好把它初始化为NULL,并在解引用这个指针时对它进行检验,防止解引用空指针。另外,为程序中任何新创建的变量提供一个合法的初始值是一个好习惯,它可以帮你避免一些不必要的麻烦。
二是通过指针变量申请一块新的内存即动态内存分配
1.采用malloc函数与free函数,这时需要包含<stdlib.h>
int *a =(int )malloc(nsizeof(int));
…
free (a);此处释放指针
2.采用new与delete:
(1)变量
int * p = new int(10);表示指针指向的内存中存放的数据是10
…
delete p;
(2)数组
int *arr = new int[10];表示数组中可以存放10个元素
…
delete[] arr;
(3)结构体
struct test{
int a;
int b;
};
int c = 0;
test * t = new test();
c = t->a;
使用new 开辟的空间是堆的空间,堆的空间不会自动释放,所以需要delete。但是delete释放其实只是释放了申请的这块内存空间,指针并没有撤销,指针还是指向这块内存,这样是非法的,因此在delete释放堆内存时,自己最好手动将指针设置为NULL。
然而在有些代码中,指针变量不进行初始化也可以正常使用。小编趁着周末深扒了一下,其实在C++中是允许空指针调用成员函数的。但是需要注意,在调用的这个函数中有没有用到this指针。下面我们来看一个例子:
//声明一个Person类
class Person
{
public:
void showClassName()// 成员函数1
{
cout<<“this is a Person class”<<endl;
}void showPersonAge()// 成员函数2
{
cout<<"age = " <<m_Age << endl;
}public:
int m_Age;//成员变量
};void test01()
{
Person *p = NULL;
p->showClassName();//空指针调用成员函数;这句话运行没有错误
p->showPersonAge();///空指针调用成员函数;这句话运行出现错误
}int main()
{
test01();
}
出错原因:调用成员函数中的m_Age实际指的是this->m_Age,而此处的this指的就是p,一个空的指针无法访问成员,需要初始化。或者在这句函数执行之前加一句判断:
if(this ==NULL)
{
return;
}
所以在运用指针时,最好还是不要用空指针。还是按照指针的正常用法一步步来。