C语言程序设计课件第6章数组、指针与字符串.ppt
《C语言程序设计课件第6章数组、指针与字符串.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件第6章数组、指针与字符串.ppt(89页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 数组、指针与字符串数组、指针与字符串C+语言程序设计1本章主要内容本章主要内容l数组数组l指针指针l动态存储分配动态存储分配l深拷贝与浅拷贝深拷贝与浅拷贝l字符串字符串2数组的概念数组的概念 数组数组是具有一定是具有一定顺序关系顺序关系的若干的若干相相同类型变量的集合体同类型变量的集合体,组成数组的变量,组成数组的变量称为该数组的称为该数组的元素元素。数组属于构造类型。数组属于构造类型。数 组3数组的几点说明数组的几点说明 数组的定义形式同数组的定义形式同C语言中的数组。语言中的数组。数组名是常量,表示数组元素的首地址。数组名是常量,表示数组元素的首地址。数组下标从零开始。数组下
2、标从零开始。下标必须是整形表达式。下标必须是整形表达式。数组元素可以在定义时直接给出初始值列表。数组元素可以在定义时直接给出初始值列表。数组元素作函数参数同简单变量作函数参数。数组元素作函数参数同简单变量作函数参数。数组名作函数参数传递的是地址值。数组名作函数参数传递的是地址值。二维数组在内存中按行存放。二维数组在内存中按行存放。数 组4对象数组对象数组l声明:声明:类名 数组名元素个数;l访问方法:访问方法:数组名下标.成员名 数 组5对象数组初始化对象数组初始化l数组中每一个元素对象被创建时,系统都会数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。调用类构造函数初始化该对
3、象。l通过初始化列表赋值。通过初始化列表赋值。Point A2=Point(1,2),Point(3,4);l如果没有为数组元素指定显式初始值,数组如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函元素便使用默认值初始化(调用默认构造函数或带默认形参值的构造函数)。数或带默认形参值的构造函数)。Point A2=Point(1,2);Point A2=Point(1,2);数 组6数组元素所属类的构造函数数组元素所属类的构造函数l各元素对象的初值要求为相同的值时,可以各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。声明具有默认形参值的构造函数。l各
4、元素对象的初值要求为不同的值时,需要各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。声明带形参的构造函数。l当数组中每一个对象被删除时,系统都要调当数组中每一个对象被删除时,系统都要调用一次析构函数。用一次析构函数。数 组7 数 组#includeusing namespace std;class Point public:Point();Point();Point:Point()coutDefault Constructor called.endl;Point:Point()coutDestructor called.endl;void main()Point A2;P163 例
5、例6-38声明声明 例:例:int i;int i;int*i_pointer;int*i_pointer;概念概念 指针:内存地址,用于间接访问内存单元指针:内存地址,用于间接访问内存单元 指针变量:用于存放地址的变量指针变量:用于存放地址的变量20003i_pointer*i_pointeri2000引用引用 i_pointer=&i;=&i;i=3;i=3;*i_pointer=3;*i_pointer=3;指 针指针变量的概念9l 语法形式语法形式 存储类型存储类型 数据类型数据类型*指针名初始地址;指针名初始地址;例:例:intint a,*pa=&a;a,*pa=&a;l 注意事项
6、注意事项用变量地址作为初值时,该变量必须在指针初始化用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。之前已说明过,且变量类型应与指针类型一致。可以用一个已赋初值的指针去初始化另一个指针变可以用一个已赋初值的指针去初始化另一个指针变量。量。不要用一个内部不要用一个内部autoauto变量去初始化变量去初始化staticstatic指针。指针。指 针指针变量的初始化10指针名指针名=地址地址l向指针变量赋的值必须是地址常量或变量,不能是向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数普通整数。但可以赋值为整数0 0,表示空指针。,表示空指
7、针。l指针的类型是它所指向变量的类型,而不是指针本指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是身数据值的类型,任何一个指针本身的数据值都是unsigned long intunsigned long int型。型。l允许声明指向允许声明指向 void void 类型的指针。该指针可以被赋类型的指针。该指针可以被赋予任何类型对象的地址。但是予任何类型对象的地址。但是不能通过不能通过voidvoid类型的类型的指针间接访问所指向的变量,必须经过强制类型转指针间接访问所指向的变量,必须经过强制类型转换。换。指 针指针变量的赋值11例例6-6 void类型指
8、针的使用类型指针的使用#includeusing namespace std;/void vobject;/错,不能声明错,不能声明void类型的变量类型的变量void*pv;/对,可以声明对,可以声明void类型的指针类型的指针int *pint;int i;void main()couti=iendl;pv=&i;/void类型指针指向整型变量类型指针指向整型变量 /cout*pv=*pvendl;/错,不能访问错,不能访问 pint=(int*)pv;cout*pint=*pintendl;指 针cout*pv=*(int*)pvendl;12指针变量的算术运算指针变量的算术运算l指针与
9、整数的加减运算指针与整数的加减运算指针指针p p加上或减去加上或减去n n,其意义是指针当前指向位置,其意义是指针当前指向位置的前方或后方第的前方或后方第n n个数据的地址。个数据的地址。这种运算的结果值取决于指针指向的数据类型。这种运算的结果值取决于指针指向的数据类型。l指针自增,自减运算指针自增,自减运算指向下一个或前一个数据。指向下一个或前一个数据。例如:例如:y=*px+y=*px+相当于相当于 y=*(px+)y=*(px+)(*(*和和+优先级相同,自右向左运算优先级相同,自右向左运算)指 针13papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa
10、+2)*(pa+3)*(pa-1)short*pashort*pa1414pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)long*pblong*pb1515l关系运算关系运算指向相同类型数据的指针之间可以进行指向相同类型数据的指针之间可以进行=与!与!=的关系运算。的关系运算。指向不同数据类型的指针,以及指针与一指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。般整数变量之间的关系运算是无意义的。指针可以和零之间进行等于或不等于的关指针可以和零之间进行等于或不等于的关系运算。例如:系运算。例如:p=0p=0或或p!=0p!=0 指 针16指向
11、数组元素的指针指向数组元素的指针l声明与赋值声明与赋值例:例:int a10,*pa;int a10,*pa;pa=&a0;pa=&a0;或或 pa=a;pa=a;l通过指针引用数组元素通过指针引用数组元素经过上述声明及赋值后:经过上述声明及赋值后:*pa*pa就是就是a0a0,*(pa+i)*(pa+i)就是就是ai.ai.ai,*(pa+i),*(a+i),paiai,*(pa+i),*(a+i),pai都是等效的。都是等效的。不能写不能写 a+a+,因为,因为a a是数组首地址(是常量是数组首地址(是常量)。指 针17指针数组指针数组l数组的元素是指针类型数组的元素是指针类型例:例:Po
12、int *pa2;Point *pa2;由由pa0,pa1pa0,pa1两个指针组成两个指针组成 指 针18例例6-8 利用指针数组存放单位矩阵利用指针数组存放单位矩阵#include#include using namespace std;using namespace std;void main()void main()int line1=1,0,0;/int line1=1,0,0;/声明数组,矩阵的第一行声明数组,矩阵的第一行int line2=0,1,0;/int line2=0,1,0;/声明数组,矩阵的第二行声明数组,矩阵的第二行int line3=0,0,1;/int line
13、3=0,0,1;/声明数组,矩阵的第三行声明数组,矩阵的第三行int*p_line3;int*p_line3;/声明整型指针数组声明整型指针数组p_line0=line1;/p_line0=line1;/初始化指针数组元素初始化指针数组元素p_line1=line2;p_line1=line2;p_line2=line3;p_line2=line3;指 针19/输出单位矩阵输出单位矩阵 coutMatrix test:endl;coutMatrix test:endl;for(int i=0;i3;i+)for(int i=0;i3;i+)for(int j=0;j3;j+)for(int j
14、=0;j3;j+)cout ;cout ;coutendl;coutendl;输出结果为:输出结果为:Matrix test:Matrix test:1 0 01 0 00 1 00 1 00 0 10 0 120 指 针也可以写成:也可以写成:p_lineij或或*(*(p_line+i)+j)*(p_linei+j)20例例6-9 二维数组举例二维数组举例#include using namespace std;void main()int a23=11,12,13,21,22,23;int (*p1)3=a;for(int i=0;i2;i+)for(int j=0;j3;j+)cout
15、*(*(p1+i)+j);coutendl;指 针可以写成:可以写成:*(p1i+j)或或p1ij21例例6-9 二维数组举例二维数组举例#include using namespace std;void main()int a23=11,12,13,21,22,23;int*p1=a;for(int i=0;i2;i+)for(int j=0;j3;j+)cout*p1+;coutendl;指 针在在C+中这种赋值中这种赋值是是错误错误的。的。22以指针作为函数参数以指针作为函数参数l以地址方式传递数据,可以用来返回以地址方式传递数据,可以用来返回函数处理结果。函数处理结果。l实参是数组名时
16、形参可以是指针。实参是数组名时形参可以是指针。指针与函数23例例6-10题目:读入三个浮点数,将整数部分和小数部分分别题目:读入三个浮点数,将整数部分和小数部分分别输出输出#include using namespace std;void splitfloat(float x,int*intpart,float*fracpart)*intpart=int(x);/取x的整数部分 *fracpart=x-*intpart;/取x的小数部分 指针与函数24void main()int i,n;float x,f;coutEnter three(3)floating point numbers en
17、dl;for(i=0;i x;splitfloat(x,&n,&f);coutInteger Part is n Fraction Part is fendl;25 指针与函数25运行结果:运行结果:Enter three(3)floating point numbers 4.7Integer Part is 4 Fraction Part is 0.78.913Integer Part is 8 Fraction Part is 0.913-4.7518Integer Part is-4 Fraction Part is-0.751826 指针与函数26例例:输出数组元素的内容和地址输出数组
18、元素的内容和地址#include include#include#include using namespace std;using namespace std;void Array_Ptr(long void Array_Ptr(long*P*P,int n),int n)int i;int i;coutIn func,address of array is coutIn func,address of array is unsigned long(unsigned long(P P)endl;)endl;coutAccessing array using pointers endl;cou
19、tAccessing array using pointers endl;for(i=0;i n;i+)for(i=0;i n;i+)cout Address for index i is cout Address for index i is unsigned long unsigned long(P+i)(P+i);cout Value is cout Value is*(P+i)*(P+i)endl;endl;指针与函数27voidvoid main()main()long list5=50,60,70,80,90;long list5=50,60,70,80,90;coutIn mai
20、n,address of array is coutIn main,address of array is unsigned long(unsigned long(listlist)endl;)endl;coutendl;coutendl;Array_Ptr(list,5);Array_Ptr(list,5);2828运行结果:运行结果:In main,address of array is 6684132In main,address of array is 6684132In func,address of array is 6684132In func,address of array
21、is 6684132Accessing array using pointersAccessing array using pointers Address for index 0 is 6684132 Value is 50 Address for index 0 is 6684132 Value is 50 Address for index 1 is 6684136 Value is 60 Address for index 1 is 6684136 Value is 60 Address for index 2 is 6684140 Value is 70 Address for in
22、dex 2 is 6684140 Value is 70 Address for index 3 is 6684144 Value is 80 Address for index 3 is 6684144 Value is 80 Address for index 4 is 6684148 Value is 90 Address for index 4 is 6684148 Value is 902929 当函数的返回值是地址时,该函数就是指当函数的返回值是地址时,该函数就是指针型函数。针型函数。定义形式:定义形式:返回值类型返回值类型 *函数名函数名(参数表参数表)函数体函数体 指针与函数3
23、0#include using namespace std;char*ch(char s)int i;for(i=0;si!=0;i+)if(si=A)break;return s+i;void main()char*s=ThbikAjiklom;coutch(s)endl;指针与函数31l声明形式声明形式数据类型数据类型 (*(*函数指针名函数指针名)();)();l含义:含义:数据指针指向数据存储区,而函数指针指向的是程序代码存储区。指向函数的指针指向函数的指针 指针与函数32例例6-11函数指针函数指针#include using namespace std;void print_stu
24、ff(float data_to_ignore);void print_message(float list_this_data);void print_float(float data_to_print);void(*function_pointer)(float);void main()float pi=(float)3.14159;float two_pi=(float)2.0*pi;指针与函数33 print_stuff(pi);function_pointer=print_stuff;function_pointer(pi);function_pointer=print_messag
25、e;function_pointer(two_pi);function_pointer(13.0);function_pointer=print_float;function_pointer(pi);print_float(pi);34 指针与函数34void print_stuff(float data_to_ignore)coutThis is the print stuff function.n;void print_message(float list_this_data)coutThe data to be listed is list_this_dataendl;void prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 课件 数组 指针 字符串
限制150内