《C程序设计第一章.ppt》由会员分享,可在线阅读,更多相关《C程序设计第一章.ppt(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第一章认识C+的对象11.2.3 动态分配内存动态分配内存 到目前为止,程序中我们只用了声明变量、数组到目前为止,程序中我们只用了声明变量、数组到目前为止,程序中我们只用了声明变量、数组到目前为止,程序中我们只用了声明变量、数组 和其他对象(和其他对象(和其他对象(和其他对象(objectsobjects)所必需的内存空间,这些内所必需的内存空间,这些内所必需的内存空间,这些内所必需的内存空间,这些内 存空间的大小都在程序执行之前就已经确定了。但如果存空间的大小都在程序执行之前就已经确定了。但如果存空间的大小都在程序执行之前就已经确定了。但如果存空间的大小都在程序执行之前就已经确定了。但如果
2、我们需要内存大小为一个变量,其数值只有在程序运行我们需要内存大小为一个变量,其数值只有在程序运行我们需要内存大小为一个变量,其数值只有在程序运行我们需要内存大小为一个变量,其数值只有在程序运行 时时时时(runtime)runtime)才能确定,例如有些情况下我们需要根才能确定,例如有些情况下我们需要根才能确定,例如有些情况下我们需要根才能确定,例如有些情况下我们需要根 据用户输入来决定必需的内存空间,那么我们该怎么办据用户输入来决定必需的内存空间,那么我们该怎么办据用户输入来决定必需的内存空间,那么我们该怎么办据用户输入来决定必需的内存空间,那么我们该怎么办 呢?呢?呢?呢?答案是动态内存分
3、配(答案是动态内存分配(答案是动态内存分配(答案是动态内存分配(dynamicmemorydynamicmemory)为此为此为此为此C+C+集成了操作符集成了操作符集成了操作符集成了操作符newnew和和和和deletedelete。21.2.3 动态分配内存动态分配内存new 动态分配内存动态分配内存一般格式:一般格式:指针变量指针变量=new 类型类型 size;new 运算符得到新分配空间的首地址,赋值运算符得到新分配空间的首地址,赋值给指针变量后,可根据指针变量的加减运算来使给指针变量后,可根据指针变量的加减运算来使用这些空间。用这些空间。delete 释放内存释放内存 使用完毕后要
4、释放内存使用完毕后要释放内存delete p;3 操作符操作符newnew的存在是为了要求动态内存。的存在是为了要求动态内存。new new 后后面跟一个数据类型,并跟一对可选的方括号面跟一个数据类型,并跟一对可选的方括号 里里面为要求的元素数。它返回一个指向内存块开始位面为要求的元素数。它返回一个指向内存块开始位置的指针。其形式为:置的指针。其形式为:p=new p=new 类型名类型名;/用来给一个单元素的数据类型分配内存。用来给一个单元素的数据类型分配内存。p=new p=new 类型名类型名 SIZE;SIZE;/用来给一个数组分配内存。用来给一个数组分配内存。P+3pP+1操作符操作
5、符 new new 和和 new new 4给一个数组分配内存给一个数组分配内存int a10,*p=a,i;int a10,*p=a,i;for(i=0;i10;i+)for(i=0;i10;i+)scanf(“%d”,p+i);scanf(“%d”,p+i);for(i=0;i10;i+)for(i=0;i k;cin k;/k=10/k=10p=new intk;p=new intk;for(int i=0;ik;i+)for(int i=0;i*(p+i);cin *(p+i);for(i=0;ik;i+)for(i=0;ik;i+)cout pi “;cout pi “;delete
6、 p;delete p;6给一个单元素的数据类型分配内存给一个单元素的数据类型分配内存#include using namespace std;struct Point int x,y;int main()/主程序主程序 Point *p;p=new Point;coutp-xp-y;coutxy;delete p;return 0;#include struct Point int x,y;int main()/*主程序主程序*/Point a,*p;p=&a;printf (“Input two interger:”);scanf(“%d%d”,&a.x,&a.y);printf(“%d%
7、d”,a.x,a.y);return 0;7 删除操作符删除操作符 deletedelete 既然动态分配的内存只在程序运行的某一既然动态分配的内存只在程序运行的某一具体阶段才有用,那么它不再被需要时就应具体阶段才有用,那么它不再被需要时就应该被释放,以便给后面的内存申请使用。操该被释放,以便给后面的内存申请使用。操作符作符delete delete 因此而产生,它的形式是:因此而产生,它的形式是:delete pointer;delete pointer;delete pointer;delete pointer;第一种表达形式用来删除给单个元素分第一种表达形式用来删除给单个元素分配的内存,
8、第二种表达形式用来删除多元素配的内存,第二种表达形式用来删除多元素(数组)的内存分配。(数组)的内存分配。在多数编译器中两种在多数编译器中两种表达式等价,使用没有区别表达式等价,使用没有区别,81.2.4 引用的使用方法引用的使用方法 C+中新的表示形式。中新的表示形式。引用即使用变量的别名。引用即使用变量的别名。定义形式:定义形式:数据类型数据类型&别名别名=对象名;对象名;作用:别名与对象名对应同一个对象,共用同一作用:别名与对象名对应同一个对象,共用同一段内存。对别名的修改会造成原对象的修改。段内存。对别名的修改会造成原对象的修改。例:例:int x;int&a=x;/表示表示a是变量是
9、变量x的别的别名。名。注意:一旦定义别名后则注意:一旦定义别名后则a和和x完全等价。完全等价。91.2.4 引用的使用方法引用的使用方法C+中新的表示形式。中新的表示形式。引用即使用变量的别名。引用即使用变量的别名。定义形式:数据类型定义形式:数据类型&别名别名=对象名;对象名;10引用是指给对象的地址取个别名,引用是指给对象的地址取个别名,数据类型数据类型&别名别名=对象名(正名)对象名(正名)intint a=56,b;a=56,b;intint&ra1=a;&ra1=a;intint&ra2=ra1;&ra2=ra1;对别名的改动则是对正名的改动。对别名的改动则是对正名的改动。引用不占有
10、存储空间,别名和对象引用不占有存储空间,别名和对象(正名)占有相同存储空间(正名)占有相同存储空间11引用作为函数参数引用作为函数参数-地址传递地址传递不能直接声明对数组的引用不能直接声明对数组的引用不能声明对引用的引用不能声明对引用的引用 intint&r=x;&r=x;()可以声明对指针的引用。可以声明对指针的引用。intint x,*p2=&x;x,*p2=&x;intint*&p1=p2;*&p1=p2;intint*&p3=p2;p1=&x;*&p3=p2;p1=&x;intint x=56;x=56;intint&a=x;&a=x;intint*p=&x;*p=&x;intint*
11、p=&a;*p=&a;12引用实例:引用实例:#include using namespace std;void main()int x=56;int&a=x;int&r=x;coutx=x&x=&xendl;couta=a&a=&aendl;coutr=r&r=&rendl;r=78;coutafter r=78endl;coutx=x&x=&xendl;couta=a&a=&aendl;coutr=r&r=&rendl;13使用引用时注意:使用引用时注意:1 1,不能定义引用的引用,不能定义引用的引用 int&r=x;int&r=x;2 2,不能直接定义数组的引用,不能直接定义数组的引用1
12、4数组的引用:数组的引用:一般格式:一般格式:typedef typedef 类型类型 类型别名类型别名使用使用typedeftypedef定义某类型别名后,可使用该定义某类型别名后,可使用该别名来定义相关对象。别名来定义相关对象。例如:例如:typedef long int lint;typedef long int lint;则则 long int i;long int i;等价于等价于 lint i;lint i;Typedef使用说明使用说明typedeftypedef用法总结:建立一个类型别名的方法用法总结:建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型别很简单,在传统
13、的变量声明表达式里用类型别名替代类型名,然后把关键字名替代类型名,然后把关键字typedeftypedef加在该加在该语句的开头语句的开头 15等价于等价于间接引用数组名作参数间接引用数组名作参数array&b=x;array&b=x;16间接引用数组实例:间接引用数组实例:#include using namespace std;typedef int array10;void main()array a=1,2,3,4,5,6,7,8,9,10;array&b=a;b9=0;cout b10 endl;for(int i=0;i10;i+)coutbi ;coutendl;cout a10
14、 endl;for(i=0;i10;i+)coutai ;coutendl;171.2.5 对指针使用对指针使用const限定符限定符1.左值和右值左值和右值表达式:表达式:E1=E2E1是左值,是可被修改的是左值,是可被修改的int*p,x=1;p=&x;*p=2;&p表示什么?表示什么?181.2.5 1.2.5 对指针使用对指针使用constconst限定符限定符2.指向常量的指针指向常量的指针constconst常量定义,表示常量定义,表示constconst后的表达式不后的表达式不可改变,定义时必须给出表达式的值。可改变,定义时必须给出表达式的值。intx=11;constint*P
15、=&x;表示表示*P是不可改变的。是不可改变的。*P不能在不能在=左侧。左侧。P=&y;x=12;19#include#include using namespace std;using namespace std;void main()void main()const int y=58;const int y=58;const int*p=&y;const int*p=&y;int x=45,z(0);int x=45,z(0);const int*p1=&x;const int*p1=&x;z=*p1+*p;z=*p1+*p;coutz=“z endl;coutz=“z endl;p1=&
16、y;p1=&y;/*p1=y;/*p1=y;z=*p1+*p;z=*p1+*p;coutz=“z endl;coutz=“z endl;201.2.5 对指针使用对指针使用const限定符限定符(识记识记)3.3.常量指针常量指针constconst常量定义,表示常量定义,表示constconst后的表达式不后的表达式不可改变,定义时必须给出表达式的值。可改变,定义时必须给出表达式的值。int x=11;int x=11;int*const P int*const P;错!必须初始化错!必须初始化int*const P=&x int*const P=&x;表示表示P P是不可改变的。是不可改变
17、的。P P不能在不能在=左侧。左侧。*p*p可改变可改变21int x=45,y;int*const p=&x;表示表示p是常量,需要初始化是常量,需要初始化 p 不能被赋值,不能被赋值,p=&y;#include using namespace std;void main()int y=58,x=66;int*const p=&y;cout“y=yendl;*p=66;/p=&x;cout“y=yendl;221.2.5 对指针使用对指针使用const限定符限定符(识记识记)4.指向常量的常量指针指向常量的常量指针const常量定义,表示常量定义,表示const后的表达式后的表达式不可改变,
18、定义时必须给出表达式的值。不可改变,定义时必须给出表达式的值。intx=11;constint*constP=&x;表示表示P是不可改变的。是不可改变的。*p不可改变。不可改变。231.2.6 泛型算法应用于普通数组泛型算法应用于普通数组所谓泛型算法就是提供的操作与元素所谓泛型算法就是提供的操作与元素的类型无关。的类型无关。泛型算法是泛型算法是C+C+标准模板库标准模板库(Standard(Standard Template Library)Template Library)提供的一组操作。提供的一组操作。利用这些操作可以简化数组操作。利用这些操作可以简化数组操作。要使用这些操作必须包含头文件
19、要使用这些操作必须包含头文件241.2.6 泛型算法应用于普通数组泛型算法应用于普通数组(识记识记)假定假定a,b是两个数组名,其长度为是两个数组名,其长度为len操作示例:操作示例:1.reverse(a,a+len)将数组将数组a中的元素顺序反转。(逆向)中的元素顺序反转。(逆向)2.copy(a,a+len,b)将将a数组的内容原样复制给数组的内容原样复制给b数组数组 reverse_copy(a,a+len,b)将将a数组的内容反转后复制给数组的内容反转后复制给b数组数组251.2.6 泛型算法应用于普通数组泛型算法应用于普通数组(识记识记)假定假定a,b是两个数组名,其长度为是两个数
20、组名,其长度为len操作示例:操作示例:reverse_copy(a,a+len,b)3.sort(a,a+len)将数组将数组a中的元素按中的元素按升序升序排序排序4.sort(a,a+len,greater()将数组将数组a中的元素按中的元素按降序降序排序排序261.2.6 泛型算法应用于普通数组泛型算法应用于普通数组(识记识记)5.find(a,a+len,value)在数组在数组a a中查找值为中查找值为valuevalue的元素,并返回位的元素,并返回位置指针置指针假定假定a a,b b是两个数组名,其长度为是两个数组名,其长度为lenlen操作示例:操作示例:find(a,a+le
21、n,4)271.2.6 泛型算法应用于普通数组泛型算法应用于普通数组(识记识记)6 6,输出数组中的内容,输出数组中的内容 Copy(a,a+len,Ostream_iterator(cout,”字符串字符串”))Ostream_iterator表示输出流操作符表示输出流操作符:表示要输出的数组类型表示要输出的数组类型Cout表示流输出操作表示流输出操作“字符串字符串”:表示分隔字符串:表示分隔字符串28例例 1-6 数组升幂排序数组升幂排序、复制、输出、复制、输出#include#include using namespace std;void main()double a=1.1,4.4,
22、3.3,2.2,b4;copy(a,a+4,ostream_iterator(cout,);reverse_copy(a,a+4,ostream_iterator(cout,);copy(a,a+4,b);copy(b,b+4,ostream_iterator(cout,);sort(a,a+4);copy(a,a+4,ostream_iterator(cout,);reverse_copy(a,a+4,b);copy(b,b+4,ostream_iterator(cout,);29例例 1-6 数组升幂排序数组升幂排序、复制、输出、复制、输出/p27-4/p27-4#include#incl
23、ude#include#include#include#include using namespace std;using namespace std;void main()void main()int a=1,2,3,4,5,6,7,8,b8;int a=1,2,3,4,5,6,7,8,b8;coutfind(a,a+8,4);coutfind(a,a+8,4);copy(a,a+8,b);copy(a,a+8,b);reverse(a,a+8);reverse(a,a+8);coutfind(a,a+8,4);coutfind(a,a+8,4);copy(a,a+8,ostream_ite
24、rator(cout,);copy(a,a+8,ostream_iterator(cout,);copy(b,b+8,ostream_iterator(cout,);copy(b,b+8,ostream_iterator(cout,);301.2.7 数据的简单输入输出格式数据的简单输入输出格式输入输出格式控制有两种方法:输入输出格式控制有两种方法:1 1 操作符函数操作符函数 2 IOSBASE2 IOSBASE接口接口31例例 1.10#include#include using namespace std;void main()int a=29,b=1001;cout asetw(6)b
25、endl;cout setw(6)a bendl;cout setfill(*)asetw(6)bendl;cout setfill(#)setw(6)a bendl;cout -endl;coutsetiosflags(ios_base:left);cout setw(10)bendl;coutsetiosflags(ios_base:right);cout setw(10)bendl;32例例 1.11#include#include using namespace std;const double PI 3.1415926void main()cout PIendl;cout setprecision(0)PIendl;cout setprecision(3)PIendl;cout setprecision(7)PIendl;int b=100;couthex=hexbendl oct=octbendl dec=decbendl;coutsetiosflags(ios_base:showpos)bendl;coutresetiosflags(ios_base:showpos)bendl;33课下作业:课下作业:课本课本P26-P27课后习题课后习题34
限制150内