第四章指针和引用 与对象有关的指针 1、对象的指针 形式: 类名*对象的指针名 例子: Cylinder cylinder l Cylinder *cylinder =&cylinder Pcylinder-> sercylinder( 20.0, 20.0) cylinder surface area(
第四章 指针和引用 一、与对象有关的指针 1、对象的指针 形式: 类名 *对象的指针名 例子: Cylinder cylinder1; Cylinder *pcylinder = &cylinder1; Pcylinder -> sercylinder(20.0,20.0); Pcylinder -> surface_area();
2This指针 This指针是指向对象的指针,它隐含在类成员函数中,用来指向 成员函数所属类的正在被操作的对象。 编译器会把对象的地址赋给成员函数中的this指针。确保访问到的 数据成员属于这个对象 例如: DateDate(int y, int m, int d is -year=y, this - month this -> day =d 注:静态成员函数没有this指针
2 This指针 This 指针是指向对象的指针,它隐含在类成员函数中,用来指向 成员函数所属类的正在被操作的对象。 编译器会把对象的地址赋给成员函数中的this指针。确保访问到的 数据成员属于这个对象 例如: Date::Date(int y,int m,int d) { this -> year = y; this -> month = m; this -> day = d; } 注:静态成员函数没有this 指针
3.指向类成员的指针 指向数据成员的指针 数据类型类名∷*数据成员指针名; 赋值: 数据成员指针名=&类名::数据成员名 例如: class a public nt A: p=&A:a
3. 指向类成员的指针 指向数据成员的指针: 数据类型 类名::*数据成员指针名; 赋值: 数据成员指针名 = &类名::数据成员名 例如: class A { public: … int a; … }; int A::*p = &A::a;
访问数据成员: 对象名*类成员指针名通过对象名访问 对象指针名→*类成员指针名/通过对象的指针访问 void mal Aa(1.5,26),*pa=&a;/pa指向a对象 double a:*px=&A:x,∥声明指向A的x的指针 a. outputxyo cout*px=t"*px<<endl;指向对象的指针及数 据成员指针访问x
访问数据成员: 对象名.*类成员指针名 //通过对象名访问 对象指针名 -> *类成员指针名 //通过对象的指针访问 void main() { A a(1.5,2.6), *pa=&a; //pa指向a对象 double A::*px = &A::x; //声明指向A的x的指针 a.outputxy(); cout*px=\t"*px<<endl;//指向对象的指针及数 据成员指针访问x
二、Void和 const指针 Void指针 Void指针可以指向任何C++数据类型。Void指针的值赋给其他类 型的指针,需要进行强制类型转换。 例如: int a int*pl=&a void p2=pI intp=p2 int *p4=(int *)p2
二、void和const指针 1.Void 指针 Void指针可以指向任何C++数据类型。Void 指针的值赋给其他类 型的指针,需要进行强制类型转换。 例如: int a; int *p1=&a; void *p2=p1; int *p3=p2; int *p4=(int *)p2;
例子: #include void maino int a=1 int pal= &a, pa2=0 void pv= pal cout<<a=t<<a<<endl 必Ou“*(mtv*int米py<endl/输出结果时void指针 须强制类型转换 pa2-=(int *pv cout<<*pa2=t <<*pa2<<endl
例子: #include void main() { int a=1; int *pa1= &a, *pa2 = 0; void *pv = pa1; cout<<"a=\t"<<a<<endl; cout<<“*(int *)pv=\t”<<*(int *)pv<<endl;//输出结果时void指针 必须强制类型转换 pa2 = (int *)pv; cout<<"*pa2=\t"<<*pa2<<endl; }
2.指针传递给函数的四种方法: 1)非常量数据的非常量指针(指针和数据都可以修改) echar *sPtr 2)常量数据的非常量指针(指针可以指向其它数据,但不能通过 指针修改数据) const char * sPtr Int a=1.b=2 Const intp=o P1=&a p a 1 =&b
2.指针传递给函数的四种方法: l)非常量数据的非常量指针(指针和数据都可以修改) •char *sPtr 2)常量数据的非常量指针(指针可以指向其它数据,但不能通过 指针修改数据) •const char *sPtr Int a = 1,b =2 Const int *p1=0; P1=&a; *p1=2; a=2; p1=&b;
3)非常量数据的常量指针(指针总是指向相同的地址,地址里 的数据可以通过指针修改) nt* const ptr-=&x,∥声明为cons指针应在声明时初始化 Int a=1. b=2 Int *const pl=&a Int*const p2 pI=2 pl=&b 4)常量数据的常量指针(指针总是指向相同的地址,地址里的 数据不能修改) const int *const ptr=&x
3)非常量数据的常量指针(指针总是指向相同的地址,地址里 的数据可以通过指针修改) •int *const ptr=&x; //声明为const指针应在声明时初始化 Int a=1,b=2; Int *const p1=&a; Int *const p2; *p1=2; p1=&b; 4)常量数据的常量指针(指针总是指向相同的地址,地址里的 数据不能修改) •const int *const ptr=&x;
动态内存分配 程序所使用的存储区 静态存储区一一程序初始化时分配的存储区。 2.栈—一局部变量分配的存储区域 3.堆一—自由存储单元,动态分配存储区 1、运算符new 形式: 指针=new数据类型 new返回首地址
三、动态内存分配 程序所使用的存储区: 1.静态存储区――程序初始化时分配的存储区。 2.栈――局部变量分配的存储区域。 3.堆――自由存储单元,动态分配存储区。 1、运算符new 形式: 指针 = new 数据类型 new 返回首地址
例子: nt“p; pnew int int*p= new int(1);/可以初始化 int*p= new int5];〃数组动态分配 int*p= new intl5-={1,2,3,4,5};∥错,不能动态分配内存时对数组 初始化
例子: int *p; p=new int ; int *p = new int(1); //可以初始化 int *p=new int[5]; //数组动态分配 int *p=new int[5]={1,2,3,4,5}; //错,不能动态分配内存时对数组 初始化