目录页 Contents 1 指针 2 持久动态内存分配 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 目录页 Contents 1 2 指针 持久动态内存分配
指针 口指针的定义与运算 ▣指针与数组(一维、二维) ▣指针数组与行指针 口指针与函数 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 指针 指针的定义与运算 指针与数组(一维、二维) 指针数组与行指针 指针与函数
指针 指针变量,简称指针,用来存放其它变量在内存中的地址 ▣指针的定义 类型标识符*指针变量名 ▣声明一个指针类型的变量,即指针 口类型标识符表示该指针可指向的对象(即目标对象)的数据类型 即指定该指针能存放哪类数据的地址 内存空间的访问方式:1)变量名;2)内存地址,即指针。 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 指针 4 指针变量,简称指针,用来存放其它变量在内存中的地址 指针的定义 声明一个指针类型的变量,即指针 类型标识符表示该指针可指向的对象(即目标对象)的数据类型, 即指定该指针能存放哪类数据的地址 类型标识符 * 指针变量名 内存空间的访问方式:1) 变量名; 2) 内存地址,即指针
指针运算 两个指针基本运算 口提取变量的内存地址:& 口引用指针所指向的变量(即目标对像):* ▣ 地址运算符:& &变量名 ∥提取变量在内存中的存放地址 int x=3; int px; ∥声明指针px px =&x; /∥将x的地址赋给指针px,简称px指向x,称x为px的目标对像 注意 指针的类型必须与其指向的对像的类型一致! 5 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 指针运算 5 两个指针基本运算 提取变量的内存地址:& 引用指针所指向的变量 (即目标对象) :* 地址运算符:& &变量名 // 提取变量在内存中的存放地址 int x=3; int * px; // 声明指针 px px = &x; // 将 x 的地址赋给指针 px,简称 px 指向 x,称 x 为 px 的目标对象 注意 指针的类型必须与其指向的对象的类型一致!
指针运算 口指针运算符:米 *指针变量 /引用指针的目标对像 int×; int*px;/声明指针变量 px =&x; *px=3;//等价于x=3,星号后面不能有空格! 指针提供了一种访问变量的高效方式,在使用指针时,通常关心的是指针所指向的对象 int x 3; int*px=&x;∥初始化,指针的值只能是相应类型的变量的地址 6 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 指针运算 6 指针运算符:* *指针变量 // 引用指针的目标对象 int x; int *px; // 声明指针变量 px = &x; *px = 3; // 等价于 x = 3,星号后面不能有空格! int x = 3; int * px = &x; // 初始化,指针的值只能是相应类型的变量的地址 指针提供了一种访问变量的高效方式,在使用指针时,通常关心的是指针所指向的对象
空指针 口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] 指针的算术运算通常是与数组的使用相联系的