C语言程序设计课件第06章数组、指针与字符串.ppt
《C语言程序设计课件第06章数组、指针与字符串.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件第06章数组、指针与字符串.ppt(89页珍藏版)》请在三一文库上搜索。
1、第六章 数组、指针与字符串,C+语言程序设计,2,本章主要内容,数组 指针 动态存储分配 深拷贝与浅拷贝 字符串,3,数组的概念,数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。 数组属于构造类型。,数 组,4,数组的几点说明,数组的定义形式同C语言中的数组。 数组名是常量,表示数组元素的首地址。 数组下标从零开始。 下标必须是整形表达式。 数组元素可以在定义时直接给出初始值列表。 数组元素作函数参数同简单变量作函数参数。 数组名作函数参数传递的是地址值。 二维数组在内存中按行存放。,数 组,5,对象数组,声明: 类名 数组名元素个数; 访问方法: 数组名下标
2、.成员名,数 组,6,对象数组初始化,数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。 通过初始化列表赋值。 Point A2=Point(1,2),Point(3,4); 如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数或带默认形参值的构造函数)。 Point A2=Point(1,2);,数 组,7,数组元素所属类的构造函数,各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。 各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。 当数组中每一个对象被删除时,系统都要调用一次析构函数。,数 组,8,数 组,#inclu
3、de using namespace std; class Point public: Point(); Point(); ; Point:Point() cout“Default Constructor called.“endl; Point:Point() cout“Destructor called.“endl; void main() Point A2; ,P163 例6-3,9,声明 例:int i; int *i_pointer;,概念 指针:内存地址,用于间接访问内存单元 指针变量:用于存放地址的变量,引用 i_pointer =,指 针,指针变量的概念,10,语法形式 存储类型
4、 数据类型 *指针名初始地址; 例:int a , *pa= 注意事项 用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。 可以用一个已赋初值的指针去初始化另一个指针变量。 不要用一个内部auto变量去初始化static指针。,指 针,指针变量的初始化,11,指针名=地址 向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。 指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsigned long int型。 允许声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。但
5、是不能通过void类型的指针间接访问所指向的变量,必须经过强制类型转换。,指 针,指针变量的赋值,12,例6-6 void类型指针的使用,#include using namespace std; /void vobject; /错,不能声明void类型的变量 void *pv; /对,可以声明void类型的指针 int *pint; int i; void main() cout“i=“iendl; pv = ,指 针,cout“*pv=“*(int *)pvendl;,13,指针变量的算术运算,指针与整数的加减运算 指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。
6、 这种运算的结果值取决于指针指向的数据类型。 指针自增,自减运算 指向下一个或前一个数据。 例如:y=*px+ 相当于 y=*(px+) (*和+优先级相同,自右向左运算),指 针,short *pa,14,pb-1,pb,pb+1,pb+2,*(pb-1),*pb,*(pb+1),*(pb+2),long *pb,15,16,关系运算 指向相同类型数据的指针之间可以进行=与!=的关系运算。 指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。 指针可以和零之间进行等于或不等于的关系运算。例如:p=0或p!=0,指针变量的关系运算,指 针,17,指向数组元素的指针,声明与赋
7、值 例:int a10, *pa; pa= 通过指针引用数组元素 经过上述声明及赋值后: *pa就是a0,*(pa+i)就是ai. ai, *(pa+i), *(a+i), pai都是等效的。 不能写 a+,因为a是数组首地址(是常量)。,指 针,18,指针数组,数组的元素是指针类型 例:Point *pa2; 由pa0,pa1两个指针组成,指 针,19,例6-8 利用指针数组存放单位矩阵,#include using namespace std; void main() int line1=1,0,0;/声明数组,矩阵的第一行 int line2=0,1,0;/声明数组,矩阵的第二行 int
8、 line3=0,0,1;/声明数组,矩阵的第三行 int *p_line3; /声明整型指针数组 p_line0=line1; /初始化指针数组元素 p_line1=line2; p_line2=line3;,指 针,/输出单位矩阵 cout“Matrix test:“endl; for(int i=0;i3;i+) for(int j=0;j3;j+) cout “ “; coutendl; ,输出结果为: Matrix test: 1 0 0 0 1 0 0 0 1,20,指 针,也可以写成: p_lineij 或 *(*(p_line+i)+j),*(p_linei+j),21,例6-
9、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*(*(p1+i)+j)“ “; coutendl; ,指 针,可以写成:*(p1i+j) 或 p1ij,22,例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+)
10、 for(int j=0;j3;j+) cout*p1+“ “; coutendl; ,指 针,在C+中这种赋值是错误的。,23,以指针作为函数参数,以地址方式传递数据,可以用来返回函数处理结果。 实参是数组名时形参可以是指针。,指针与函数,24,例6-10,题目:读入三个浮点数,将整数部分和小数部分分别输出 #include using namespace std; void splitfloat(float x, int *intpart, float *fracpart) *intpart=int(x); / 取x的整数部分 *fracpart=x-*intpart; / 取x的小数部分
11、 ,指针与函数,void main() int i, n; float x, f; cout x; splitfloat(x, ,25,指针与函数,运行结果: Enter three(3) floating point numbers 4.7 Integer Part is 4 Fraction Part is 0.7 8.913 Integer Part is 8 Fraction Part is 0.913 -4.7518 Integer Part is -4 Fraction Part is -0.7518,26,指针与函数,27,例: 输出数组元素的内容和地址,#include #in
12、clude using namespace std; void Array_Ptr(long *P, int n) int i; cout“In func, address of array is “ unsigned long(P)endl; cout“Accessing array using pointers“ endl; for (i = 0; i n; i+) cout“ Address for index “i“ is “ unsigned long(P+i); cout“ Value is “*(P+i)endl; ,指针与函数,void main() long list5=50
13、, 60, 70, 80, 90; cout“In main, address of array is “ unsigned long(list)endl; coutendl; Array_Ptr(list,5); ,28,运行结果: In main, address of array is 6684132 In func, address of array is 6684132 Accessing array using pointers Address for index 0 is 6684132 Value is 50 Address for index 1 is 6684136 Val
14、ue is 60 Address for index 2 is 6684140 Value is 70 Address for index 3 is 6684144 Value is 80 Address for index 4 is 6684148 Value is 90,29,30,指针型函数,当函数的返回值是地址时,该函数就是指针型函数。 定义形式: 返回值类型 *函数名(参数表) 函数体 ,指针与函数,31,指针型函数,#include using namespace std; char *ch(char s ) int i; for(i=0;si!=0;i+) if(si=A) br
15、eak; return s+i; void main() char *s=“ThbikAjiklom“; coutch(s)endl; ,指针与函数,32,声明形式 数据类型 (*函数指针名)(); 含义: 数据指针指向数据存储区,而函数指针指向的是程序代码存储区。,指向函数的指针,指针与函数,33,例6-11函数指针,#include using namespace std; void print_stuff(float data_to_ignore); void print_message(float list_this_data); void print_float(float data
16、_to_print); void (*function_pointer)(float); void main() float pi=(float)3.14159; float two_pi=(float)2.0*pi;,指针与函数,print_stuff(pi); function_pointer = print_stuff; function_pointer(pi); function_pointer = print_message; function_pointer(two_pi); function_pointer(13.0); function_pointer = print_floa
17、t; function_pointer(pi); print_float(pi); ,34,指针与函数,void print_stuff(float data_to_ignore) cout“This is the print stuff function.n“; void print_message(float list_this_data) cout“The data to be listed is “ list_this_dataendl; void print_float(float data_to_print) cout“The data to be printed is “ dat
18、a_to_printendl; ,35,指针与函数,运行结果: This is the print stuff function. This is the print stuff function. The data to be listed is 6.283180 The data to be listed is 13.000000 The data to be printed is 3.141590 The data to be printed is 3.141590,36,指针与函数,37,指向常量的指针,int i=13; int const *p= /指向常量的指针变量 注:不能通过
19、指针来改变所指对象的值,指针所指向的对象的值( i的值)可以通过直接访问方式进行更新,指针本身的值也可以改变,可以指向另外的对象。,指 针,38,#include using namespace std; void main() int i=13; int *p= ,指 针,#include using namespace std; void main() int i=13; int const *p= ,此语句编译错误,指向常量的指针,39,char *name1=“John“; char s=“abc“; name1=s; *name1=1;,char const *name1=“John
20、“; char s=“abc“; name1=s; *name1=1;,错误!不能通过指向常量的指针改变所指向的对象的值,指 针,指向常量的指针,char *name1=“John“; name1=“abcdef“; *name1=A;,运行时错误!字符串常量的内容不能被改变,40,指针类型的常量,若声明指针常量,则指针本身的值不能被改变。 例: char *const name2=“John“; name2=“abc“; /错误,指针常量值不能改变,指 针,41,对象指针,声明形式 类名 *对象指针名; 例 Point A(5,10); Piont *ptr; ptr=,对 象 指 针,42
21、,对象指针应用举例,void main() Point A(5,10); Point *ptr; ptr= ,对 象 指 针,43,this指针,隐含于每一个类的成员函数中的特殊指针。 明确地指出了成员函数当前所操作的数据所属的对象。 当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。,this 指 针,44,this指针,例如:Point类的构造函数体中的语句: X=xx; Y=yy; 相当于: this-X=xx; this-Y=yy;,this 指 针,45,this指针,一般的程序设计中,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 课件 06 数组 指针 字符串
链接地址:https://www.31doc.com/p-2143091.html