指针和自定义数据类型课件

上传人:我*** 文档编号:143734015 上传时间:2020-09-01 格式:PPT 页数:23 大小:87KB
返回 下载 相关 举报
指针和自定义数据类型课件_第1页
第1页 / 共23页
指针和自定义数据类型课件_第2页
第2页 / 共23页
指针和自定义数据类型课件_第3页
第3页 / 共23页
指针和自定义数据类型课件_第4页
第4页 / 共23页
指针和自定义数据类型课件_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《指针和自定义数据类型课件》由会员分享,可在线阅读,更多相关《指针和自定义数据类型课件(23页珍藏版)》请在金锄头文库上搜索。

1、第五讲 指针和自定义数据类型,y= + pxy= ( + px) y= px+y= ( px+ ) 注意优先级和结合顺序 问题:y= px+和y= (px)+的意义,struct student int number; char name4; student *pst;,5.1 指针及其运算 5.1.1 指针的算术运算,pxn: pxnsizeof(T),px-py: ( px-py) / sizeof(T),px+n, px-n 将指针从当前位置向前或向后移动n个数据单位,而不是n个字节。 这取决于指针所指向的数据类型(T)。,px-py求出的是两指针位置之间的数据个数,而不是地址差。,5.

2、1.3 指针的关系运算 是对两个相同类型的指针的运算,如pxpy,当px所指位置在py之前时,表达式的值为 1,否则为0。 px=0, px!=0用来判断px是否为空指针。,5.1.4 指针的赋值运算 赋的值必须是地址常量或变量,而不能是普通整数,有以下几种形式: 1. 变量地址赋予指向相同数据类型的指针 char c, *pc; pc=,不同类型的指针以及指针和一般整数间的关系运算是无意义的。,5.2 指针和数组 5.2.1 指针与数组的关系 可以用指针代替数组下标来访问数组: f ( ) int a5; int *pa; pa=a; *(pa+3)=10; pa3=10; *(a+3)=1

3、0; a3=10; ,5.2.2 字符指针与字符数组 可用字符数组表示字符串,也可用字符指针指向字符串的首址。 指针表示字符串可以赋多个串值,只要将字符串的首址赋给它。 字符数组是常量不能赋值。,指针与数组的差异: 指针是地址变量,可任意改变它的值; 数组名是地址常量,其值不能改变。,#include void main ( ) static char str =string; char *ps; ps=str; while ( *ps !=0) cout*ps; ps+; coutendl; ,5.2.3 指针数组 指向同一类型对象的指针组成的数组。每个数组元素都是一指针变量。 存储类型 数

4、据类型 * 指针数组名元素个数,#include void main ( ) int a23, *pa2; pa0=a0; pa1=a1; for ( int i=0; i3; i+ ) *( pa0+i)=i; for ( i=0; i3; i+ ) *( pa1+i)=i; for ( i=0; i2; i+ ) coutendl; for ( int j=0; j3; j+ ) coutaij ; ,5.2.4 指针的指针 存储类型 数据类型 * *变量;,int *p; P是一个指向int * 类型空间的指针,动态分配空间2次。 p=new int *; /存放int 的指针 *p=n

5、ew int ; /存放整数空间 *p=256;,#include void main() int *p; p=new int *; *p=new int ; *p=256; cout*pendl; int k=2000; *p= ,#include void main ( ) char *app; static char *a= Wang, Liu, Zhang ; app=a; cout*appendl; cout*appendl; cout*(app+1)endl; cout*(*(app+2)+2)endl; ,5.3 指针和函数 5.3.1 指针函数(指针作为函数的返回值) 存储类型

6、 数据类型 * 函数名(参数表),#include char *string_name ( int n ) char * string = illegal string, string 1, string 2, string 3 ; return ( n3 ) ? string0: stringn; void main() char *p; int n=0; p=string_name(n); coutpendl; ,返回的是变量地址,必须保证函数返回后,这个变量仍然存在。要返回函数中局部变量的地址,应声明为静态的。,static,5.3.1 函数指针(函数的入口地址可赋给指针) 虽然函数不是

7、变量,仍占存储空间,此空间的首地址函数入口地址。 存储类型 数据类型 (* 函数指针名)(参数表) int (*fp) ( char ); /fp为一函数指针, 此函数 的返回值为int,参数为char,要将函数指针指向一具体的函数,用赋值语句: int f( char ); fp=,int i=f (a) ;,int i= (*fp) (a);,要保证函数指针的参数和返回值与所指向的函数正好匹配。 #include void (*fp) ( char * ); void f1(char * s1 ) couts1endl; int f2( char * s2) couts2endl; ret

8、urn 0; void f3( int *i1 ) cout*i1endl; void main( ) fp= ,C+不能把函数当作参数传递,但传递函数指针允许。 void sort ( void * base, int n, int sz, int (*cmp) (void*, void* ) /把n个元素的向量base按升序排列,向量每个元素大小sz for(int i=0; in-1;i+) for (int j=n-1; ij; j-) char *pj=(char*) base+j*sz; /basej char *pj1=pj-sz; /basej-1 if(*cmp)(pj,pj

9、1)0) for( int k=0; ksz; k+) char temp=pjk; pjk=pj1k; pj1k=temp; ,void * 性质:任何类型的指针都可以赋给它。作为参数传入指向任何类型的指针都可与它匹配。,两个比较函数: #include int cmp_int ( void *p, void *q) if ( *(int*)p*(int*)q ) return -1; else if ( * (int *) p = * (int *) q ) return 0; else return 1; int cmp_str ( void *p, void *q ) return s

10、trcmp ( * (char *) p, * (char *) q ); ,主程序: #include void main ( ) static int ii = 3,9,5,4; static char *str = compare, the, sring ; sort ( ii, 4, sizeof (int), ,5.4 指针、引用、常量和复杂类型 5.4.1 指针与常量,注意:不能把一个const变量的地址赋给指向非const的指针,否则会无形中改变常量的值,const int n=1; int *pInt; pInt=,指向常量的指针,const int *p;,char * co

11、nst p;,指针常量,const char * const p;,指向常量对象的指针常量,5.5 结构、联合、和用户自定义类型 5.5.1 结构的定义和声明 struct person char name20; char sex; char addr50; double salary; ;,结构的成员可以是变量,数组,也可是指针和函数。 使用结构要创建对象: person LiMing; person *p=new person;,结构嵌套(结构的成员是另一结构对象): struct date struct person int day; char name20; char month5;

12、char sex; int year; char addr50; ; double salary; date birthday; ,嵌套不能包含自身,5.5.2 对结构的操作 运算符 . 按对象访问成员; 运算符 - 按指针访问成员。 如:LiMing. Salary=1200.56; p-sex=M;,5.5.3 结构、指针和数组 结构名 结构数组名元素个数; 结构名 *结构指针名; ex. 10 person company52; person *pperson=company; cout(*(pperson+3).nameendl; 结构中成员指针的类型没有任何限制,可以是基本类型,也可

13、以是结构,甚至可以定义引用自身的结构。 ex. 11 struct inode int data; inode *next; ;,举例:70%的学生通过考试,从键盘输入学生姓名和成绩,按分数高低输出,并用pass或fail表示是否通过考试 #include #include struct STUDENT char name10; int grade; ; void sortclass(STUDENT st , int nst); void swap(STUDENT ,void main( ) STUDENT *classes; int ns; coutns; classes=new STUDE

14、NTns; coutclassesi.nameclassesi.grade; sortclass(classes, ns); const int cutoff=(ns*7)/10-1; for( i=0; ins; i+) coutclassedi.name“ “classi.grade; if(i=cutoff) cout“passn”; else cout“failn”; ,void sortclass(STUDENT st , int nst) for( int i=0; istpick.grade ) pick=j; swap(sti, stpick); ,void swap(STUDENT ,5.5.5 联合 union 联合名 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; ; 成员1、成员2、成员n共享内存,编译器总是按联合中最大成员类型分配内存。,5.5.6 枚举(一个有名字的整数集合) enum 枚举名 标识符1,标识符2, ,标识符n 例如: enum color re

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号