1:什么是指针和指针的分类
1:什么是指针
答:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,要搞清一个指针要搞清指针的三个内容:1.指针的类型,2.指针指向的类型,3.指针指向哪里
2:指针的三个内容
@1:指针的类型(就是直接将ptr去掉)
int *ptr; //指针的类型是int *
char *ptr; //指针的类型是char *
int **ptr; //指针的类型是 int **
int (*ptr)[3]; //指针的类型是 int(*)[3]
int *(*ptr)[4]; //指针的类型是 int *(*)[4]
@2:指针指向的类型(就是指直接去掉*ptr)
int *ptr; //指针所指向的类型是int
char *ptr; //指针所指向的的类型是char
int **ptr; //指针所指向的的类型是 int *
int (*ptr)[3]; //指针所指向的的类型是 int()[3]
int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]
@3:指针的值
在32位的程序里所有类型的指针的值都是一个32位的整数。因此指针本身占据的内存大小是4个字节的长度,用sizeof(指针的类型)就能知道。
@4:指针指向的值
2:指针野指针的判断
@1:案例
#include <iostream>
using namespace std;
#define SAFE_DELETE(x) if( (x) != NULL ) { delete (x); (x) = NULL; } //@1不直接delete,通过 SAFE_DELETE释放,保证了 x=NULL
#define KEY_VALUES 1234321 //用来避免野指针 //@2给类对象赋予一个用于判断是否正常的变量
#define IF_NOT(x,x1) if ((!x) ? 1 :((x1 != KEY_VALUES) ? 1:(assert(false),0)))
class A
{
public:
A(){ this->nKey = KEY_VALUES; }
void fun(){ cout << "ssssssssssssssss" << endl; }
int nKey;
};
void main()
{
A *p = new A;
A *p1 = p;
SAFE_DELETE(p); //处理方法@1
IF_NOT(p1,p1->nKey) //一旦p1是野指针的话,nKey就会变成乱值与 KEY_VALUES一样的概率很低
{//处理方法@
2p->fun();
}
}