空指针 口void类型的指针 void*指针名 ▣void类型的指针可以存放任何类型数据的地址,即指向任何类型的对象 口不允许直接通过void指针来访问其目标对象! 口若需访问vod类型指针的目标对象,必须通过显式类型转换指明目标对象的类型 int x =3; int px; void pv; pv-&x;/∥OK,void型指针指向整型变量 px=(int*)pv;∥OK,使用void型指针时需要强制类型转换 1 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 空指针 7 void 类型的指针 void 类型的指针可以存放任何类型数据的地址,即指向任何类型的对象 不允许直接通过 void 指针来访问其目标对象! 若需访问 void 类型指针的目标对象,必须通过显式类型转换指明目标对象的类型 void * 指针名 int x = 3; int * px; void * pv; pv = &x; // OK, void 型指针指向整型变量 px = (int *)pv; // OK,使用 void 型指针时需要强制类型转换
指针赋值 口指针可能的取值 (1)空指针:0,NULL或值为0,NULL的常量 (2)类型匹配的对象的地址 (3)同类型的另一有效指针 (4)类型匹配的对象的前、后地址(相对位置) 没有初始化或赋值的指针是无效的指针;引用无效指针会带来难以预料的问题! intx[3]={1,2,3}; int pz; int px =&x[]; pz=0;/0K int py =&x+1; pZ NULL;/OK 8 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 指针赋值 8 指针可能的取值 (1) 空指针:0, NULL 或值为 0, NULL 的常量 (2) 类型匹配的对象的地址 (3) 同类型的另一有效指针 (4) 类型匹配的对象的前、后地址(相对位置) int x[3] = {1,2,3}; int * px = &x[0]; int * py = &x+1; int * pz; pz = 0; // OK pz = NULL; // OK 没有初始化或赋值的指针是无效的指针;引用无效指针会带来难以预料的问题!
指针与常量 ▣指向常量的指针 const类型标识符*指针名 const int a 3; int*pa-&a;∥ERROR,普通指针不能指向常量 const int cpa =&a;//OK 口指向const对象(常量)的指针必须用const声明! 口这里的const限定了指针所指对象的属性 ex06_pointer_const.cpp const int a 3; int b 5; const int cpa =&a;/OK *cpa =5;/ERROR cpa =&b;/OK *cpa 9;/ERROR b=9;//0K ▣ 允许把非const对象的地址赋给指向const的指针 ▣ 但不允许使用指向cost的指针来修改其目标对象的值 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 指针与常量 9 const int a = 3; int b = 5; const int * cpa = &a; // OK *cpa = 5; // ERROR cpa = &b; // OK *cpa = 9; // ERROR b = 9; // OK 指向常量的指针 指向 const 对象(常量)的指针必须用 const 声明! 这里的 const 限定了指针所指对象的属性 const 类型标识符 * 指针名 const int a = 3; int * pa = &a; // ERROR, 普通指针不能指向常量 const int * cpa = &a; // OK ex06_pointer_const.cpp 允许把非 const 对象的地址赋给指向 const 的指针 但不允许使用指向 const 的指针来修改其目标对象的值
指针与常量 口常量指针,简称常指针 类型标识符*const指针名 口常量指针:指针本身的值不能修改 int a 3,b =5; int const pa =&a;/OK pa =&b;/ERROR 口指向常量的常量指针 const类型标识符*const指针名 口指针本身的值不能修改,也不能通过它来修改其指向的对象 10 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 指针与常量 10 常量指针,简称常指针 常量指针:指针本身的值不能修改 指向常量的常量指针 指针本身的值不能修改,也不能通过它来修改其指向的对象 类型标识符 * const 指针名 int a = 3, b = 5; int * const pa = &a; // OK pa = &b; // ERROR const 类型标识符 * const 指针名
指针算术运算 指针可以和整数或整型变量进行加减运算,运算规则与指针的类型有关! int pa;int k; pa+k∥pa所指的当前位置之后第k个元素的地址 pa-k∥pa所指的当前位置之前第k个元素的地址 指针的算术运算通常是与数组的使用相联系的 intx[5]={6,1,2,3,4}; int*px=&x[o];/∥px指向[O] cout <<*px <endl; /∥输出[0]的值 cout<*(px+1)<end1;∥输出的X[1)值 px=px+2;∥px改为指向[2] 11 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 指针算术运算 11 指针可以和整数或整型变量进行加减运算,运算规则与指针的类型有关! int * pa; int k; pa + k // pa 所指的当前位置之后第 k 个元素的地址 pa - k // pa 所指的当前位置之前第 k 个元素的地址 int x[5] = {0,1,2,3,4}; int * px = &x[0]; // px 指向 x[0] cout << *px << endl; // 输出 x[0] 的值 cout << *(px+1) << endl; // 输出的 x[1] 值 px = px + 2; // px 改为指向 x[2] 指针的算术运算通常是与数组的使用相联系的