C++基础知识记录---重新认识指针
C++基础知识记录---重新认识指针
1》一句话理解
Fistly ---先看一个示例:int *p = &i;//分开看,p=&i;
指针变量p中存着i的内存地址, 加入星号的*p(代表指针了)是通过地址映射到确切的值
int :代表指针指向数值的类型
Secondly---举形象化的例子:快递员上门给我送快递,手中拿的地址(即指针变量p) eg:几号楼几单元101 ,按地址找到我家中具体的人(我,也是变量i ;也是*p),这里的*p可以理解成映射到人,也可以理解成按地址索骥找到的人
总之,p指针变量,存地址;*p映射到的变量值;

2》指针的释放
------内存释放的小窍门
可以有效的避免因为忘记对指针进行置空而出现各种内存问题。两种方法:
a)自定义一个内存释放函数,传入参数是指针的地址,在这个函数里面置空
b)定义FREE宏,在宏里面对他进行置空。
注---void的意思是空,但是void指针的意思,可不是空指针的意思
void指针实际上的意思是指向任意类型的指针
a)内存释放函数
#include<iostream> using namespace std; void my_free(void *p){ void **tp = (void **)p;//定义一个指向指针地址的指针,即指向p中的地址 //将传进来的指针的地址给中间定义的指针的指针tp if (NULL == *tp)//可以这么理解上面的void **tp =(void *)*tp //地址为空,即实际操作中出现free(p)/delete(p) return;//直接返回,意味已经实现了free等操作 free(*tp);//将新申请的临时指针变量释放 *tp = NULL;//释放的同时让其为空,否则成为了野指针 } int main(){ int *p = new int; *p = 1;//将值映射 cout << p << endl;//输出1的地址 my_free(&p);//释放p的地址 //my_free调用了之后,p的值就变成了0(NULL),调用多少次free都不会报错了! //free(NULL)当然没错 cout << p << endl;//p=NULL,即p=0;此时应该输出为0; free(p);//释放 //p = NULL;//测试用p的地址在free之后成为野指针,此时p=NULL, 从头开始 //free(p); //free(NULL);//测试用 free(NULL)当然没错 return 0; }
b)定义FREE宏
#include<iostream> using namespace std; #define FREE(x) if(x) free(x);x=NULL int main(){ int *p = new int; *p = 1;//将值映射 cout << p << endl;//输出1的地址 FREE(p);//释放p的地址 //my_free调用了之后,p的值就变成了0(NULL),调用多少次free都不会报错了! //free(NULL)当然没错 cout << p << endl;//p=NULL,即p=0;此时应该输出为0; free(p);//释放之后就不能写入内存了,所以一般free放在最后 p = NULL; free(p); //free(NULL);//free(NULL)当然没错 return 0; }

3》const定义的指针等内容

参考链接 :http://www.cnblogs.com/bluewelkin/p/4059840.html 作者资深的实战专家,对于指针应用非常了然
函数指针还没看,一定补上

浙公网安备 33010602011771号