指针:访问动态分配的内存
数组内存分配:顺次存放,地址相互连接(二阶或者更高阶都是如此);可以在列表中进行初始化(但是不能跳跃赋值)
例:a[3][4]= {1,2,3,4,5,6,7,8,9,…} //全部赋值(支持缺省维度)
{{1,2,3,4},{5,6,7,8},…} //分行赋值
{{1},{0,6},{0,0,1,1}} //部分元素赋值
同类型的数据才能初始化指针(auto和static不能互相赋值)
Void *Ptr可以存放任何类型地址,只做存放无法操作,使用前必须强制类型转换(无void类型的变量)
Void *Pv; int i=5;
Int *Pint = static_cast<int *>(Pv);
常指针:不能通过指针改变指向对象的值,但是指针本身能够改变
Const int*P1 = &a; int b;
P1=&b;//(正确,P1本身能够被改变) *P1=1;//(错误,不能通过指针改变所指向的对象)
指针变量的算数运算(用于处理数组/链表):*(Ptr+n);/Ptr+n //访问Ptr后n个n数据(越过地址数和数据类型有关)的内容
指针关系运算(==、!=):检测其是否指向同一位置
指针可以与0进行关系运算
指针处理数组元素
Int *Pa = &a[0];或int *Pa = a;
可以Pa++但是不能a++
指针数组 Point *Pa[2];
Int Line1[],Line2[],Line3[];
Int *PLine[3] = {Line1,Line2,Line3}; Line1、Line2、Line3地址不见得连续(二维数组的话会连续)
指针作为函数参数(传递一个数组)
指针作为返回值(一般返回静态数据或全局变量,动态数据离开函数会失效会造成非法地址引用)
指向函数的指针(不仅仅指向变量) 存储类型 数据类型 *函数名()
数据指针指向数据存储区、函数指针指向程序代码区
Void (*FuncPoint)(float a);//需要声明参数列表
FuncPoint = PrintStuff;//指向函数
FuncPoint(13.2);//调用
指向对象的指针
Point a(5,10); Point *Ptr;
Ptr = &a;
指针访问成员: Ptr->GetX();
This指针:(隐含)指向当前对象本身 a.GetX(); 等价于 This->X; 静态函数无this指针
指向类的非静态成员指针
数据成员: 类型说明符 类名::*指针名;
指针名 = &类名::数据成员名;
函数成员: 类型说明序 (类名::*指针名)(参数列表);
对象名.*类成员指针名;
对象指针名->*类成员指针名;
动态分配内存空间
A a = new A(12,35); new会返回指定类型的指针
A *Ptr1 = new A();
Delete a;//释放内存
申请和释放动态数组
New 类型名T[数组长度] 数组长度可以是变量/常量(静态数组只能是常量)
Delete[] 数组名P(P必须是new数组的首地址)|如果使用delete则只会释放首地址