指针
·指针的定义:
·指针是一个对象集(类比int float,etc);
·指针里面存储的值为内存单元的地址;
·*指针对象具有一组操作。
·整形不能赋值给指针
·指针的声明:int *p,赋值不带*;
·指针的定义:*Obj_Name;
·指针的操作(运算符)
·普通指针允许:
·+- sizeof() * -> //sizeof()是运算符而不是函数 ->指向操作符 +操作付表示从这个指针向后移多少个单位,-操作符与之互逆 *解引用操作符 例:
·int a =5; int *p=&a; cout<<a<<endl; cout<<*p<<endl; //此时*p就相当于a;
·注意事项
·对于普通指针的赋值而言,左右两边的基类型一定要相同;
·指针存在4种状态:指向一个对象,指向紧邻对象的内存空间地址,空指针和无效指针(野指针);
·访问无效指针的值都将发生错误,但是编译器不负责检查此类错误(任何访问无效指针的行为都是耍流氓~);
·int *p=0 or int *p=NULL; int *p=nullptr //空指针
·int *p; //无效指针,内容物随机
·认识指针
·double *p=&a;中,变量p的类型为double*,基类型为double(即所指向的变量类型必须为double);
·一个指针变量最多只能指向一个基类型对象,一个基类型变量能被多个该类型的指针变量指向;
·对指针变量解指针后的任何操作,都是对该指针变量所指向的对象的操作
·指针可以表示一个对象
·指针是内存地址
·指针是个类型
C/C++内存模型结构
·5大区
·源代码区 //存放代码的内存区域 ·静态区 //存放静态变量和全局变量的内存区域
·栈区 //存放局部变量和参数的内存区域,由系统开辟空间,由系统进行回收的 ·堆区 //程序员开辟的一块内存区域用来存放对象的 ,由程序员来开辟和收回的
·常量区。(字面值区)
指针可以指向哪些区?
·堆区 ·栈区 ·静态区 ·常量区 ·代码区
数组的地址就是首元素的地址
void *指针
·void *是一种特殊的指针类型,可用于存放任意对象的地址,一个void*指针存放着一个地址,这一点和其他指针类似,不同的是,我们对该地址中到底是个什么类型的对象并不了解:
double obj=3.14,*pd=&obj;
void *pv=&obj;
pv=pd;
利用void*指针能做的事比较有限,拿它和别的指针比较,作为函数的输入或输出,或者赋给另外一个void*指针。不能直接操作void*指针指向的对象,因为我们并不知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。
概括说来,以void*指针的视角来看内存空间也就仅仅是内存空间,没办法访问内存空间中所存的对象。