资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第二讲第二讲 指针和自定义数据类型指针和自定义数据类型 y= + pxy= ( + px) y= px+y= ( px+ ) 留意留意优先先级和和结合合顺序序问题:y= px+和和y= ( px)+的含的含义?struct student int number; char name4;student *pst;2.1 指指针及其运算及其运算2.1.1 指指针的算的算术运算运算pstpst=pst+1; px n: px n sizeof(T)px-py:( (int)px-(int)py) / sizeof(T)px+n, px-n 将指将指针针从当前位置向前或向后挪从当前位置向前或向后挪动动n个数据个数据单单位,而不是位,而不是n个字个字节节。 这这取决于指取决于指针针所指向的数据所指向的数据类类型型(T)。 px-py求出的是两指针位置之间的数据个数,而不是地址差。求出的是两指针位置之间的数据个数,而不是地址差。2.1.2 2.1.2 指指指指针针的关系运算的关系运算的关系运算的关系运算 是是是是对对两个一两个一两个一两个一样类样类型的指型的指型的指型的指针针的运算,如的运算,如的运算,如的运算,如pxpypxpy,当,当,当,当pxpx所指位所指位所指位所指位置在置在置在置在pypy之前之前之前之前时时,表达式的,表达式的,表达式的,表达式的值为值为 1 1,否那么,否那么,否那么,否那么为为0 0。 px=0, px!=0 px=0, px!=0用来判用来判用来判用来判别别pxpx能否能否能否能否为为空指空指空指空指针针。2.1.3 2.1.3 指指指指针针的的的的赋值赋值运算运算运算运算 赋赋的的的的值值必需是地址常量或必需是地址常量或必需是地址常量或必需是地址常量或变变量,而不能是普通整数,有以量,而不能是普通整数,有以量,而不能是普通整数,有以量,而不能是普通整数,有以下几种方式:下几种方式:下几种方式:下几种方式: 1. 1. 变变量地址量地址量地址量地址赋赋予指向一予指向一予指向一予指向一样样数据数据数据数据类类型的指型的指型的指型的指针针 char c, *pc; char c, *pc; pc=&c; pc=&c; 2. 2.指指指指针赋针赋予一予一予一予一样样数据数据数据数据类类型的另一指型的另一指型的另一指型的另一指针针 int *p, *q; int *p, *q; int i; int i; q=&i; q=&i; p=q; p=q; 不同类型的指针以及指针和普通整数间的关系运算是无意义的。不同类型的指针以及指针和普通整数间的关系运算是无意义的。2.2 指指针和数和数组 2.2.1 指指针与数与数组的关系的关系 可以用指可以用指针替代数替代数组下下标来来访问数数组: f ( ) int a5; int *pa; pa=a; *(pa+3)=10; pa3=10; *(a+3)=10; a3=10; 2.2.2 2.2.2 字符指字符指字符指字符指针针与字符数与字符数与字符数与字符数组组 可用字符数可用字符数可用字符数可用字符数组组表示字符串,也可用字符指表示字符串,也可用字符指表示字符串,也可用字符指表示字符串,也可用字符指针针指向字符串指向字符串指向字符串指向字符串的首址。的首址。的首址。的首址。 指指指指针针指向字符串可以多次指向不同串指向字符串可以多次指向不同串指向字符串可以多次指向不同串指向字符串可以多次指向不同串值值,只需将字符串,只需将字符串,只需将字符串,只需将字符串首址首址首址首址赋给赋给它。它。它。它。 字符数字符数字符数字符数组组是常量不能是常量不能是常量不能是常量不能赋值赋值。指针与数组的差别:指针与数组的差别:指针是地址变量,可恣意改动指针是地址变量,可恣意改动它的值;它的值;数组名是地址常量,其值不能数组名是地址常量,其值不能改动。改动。 ex. 1 include main ( ) static char str =string; char *ps; ps=str; while ( *ps !=0) cout*ps; ps+; coutendl; 2.2.3 2.2.3 指指指指针针数数数数组组 指向同一指向同一指向同一指向同一类类型型型型对对象的指象的指象的指象的指针组针组成的数成的数成的数成的数组组。每个数。每个数。每个数。每个数组组元素都是元素都是元素都是元素都是一指一指一指一指针变针变量。量。量。量。 存存存存储类储类型型型型 数据数据数据数据类类型型型型 * * 指指指指针针数数数数组组名名名名 元素个数元素个数元素个数元素个数 ex. 2 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; 2.3 指指针和函数和函数2.3.1 指指针函数指函数指针作作为函数的前往函数的前往值 存存储类型型 数据数据类型型 *函数名参数表函数名参数表 ex. 3 char *string_name ( int n ) char * string = illegal string, string 1, string 2, string 3 return ( n3 ) ? string0: stringn; static前往的是变量地址,必需保证前往的是变量地址,必需保证函数前往后,这个变量依然存函数前往后,这个变量依然存在。要前往函数中部分变量的在。要前往函数中部分变量的地址,应声明为静态的。地址,应声明为静态的。2.3.2 2.3.2 函数指函数指函数指函数指针针函数的入口地址可函数的入口地址可函数的入口地址可函数的入口地址可赋给赋给指指指指针针 虽虽然函数不是然函数不是然函数不是然函数不是变变量,仍占存量,仍占存量,仍占存量,仍占存储储空空空空间间,此空,此空,此空,此空间间的首地址的首地址的首地址的首地址函函函函数入口地址。数入口地址。数入口地址。数入口地址。 存存存存储类储类型型型型 数据数据数据数据类类型型型型 * * 函数指函数指函数指函数指针针名参数表名参数表名参数表名参数表 ex. 4 int (*fp) ( char ); /fp ex. 4 int (*fp) ( char ); /fp为为一函数指一函数指一函数指一函数指针针, 此函数此函数此函数此函数 的前往的前往的前往的前往值为值为intint,参数,参数,参数,参数为为charchar 要将函数指针指向一详细的函数,用赋值语句:要将函数指针指向一详细的函数,用赋值语句: ex. 5 int f( char ); fp=&f;int i=f (a) ;int i= (*fp) (a); 要保证函数指针的参数和前往值与所指向的函数正好匹配。要保证函数指针的参数和前往值与所指向的函数正好匹配。 ex. 6 void (*fp) ( char * ); void f1(char * s1 ); int f2( char * s2); void f3( int *i1 ); void main( ) fp=&f1; fp=&f2; fp=&f3; (* fp) (asdf); (* fp) (1); int i=(*fp) (qwer); C+C+不能把函数当作参数不能把函数当作参数不能把函数当作参数不能把函数当作参数传传传传送,但送,但送,但送,但传传传传送函数指送函数指送函数指送函数指针针针针允允允允许许许许。 ex. 7 void sort ( void * base, unsigned int n, unsigned int sz, ex. 7 void sort ( void * base, unsigned int n, unsigned int sz, int (*cmp) (void*, void* ) int (*cmp) (void*, void* ) / /把把把把n n个元素的向量个元素的向量个元素的向量个元素的向量basebase按升序按升序按升序按升序陈陈陈陈列,向量每个元素大小列,向量每个元素大小列,向量每个元素大小列,向量每个元素大小szsz for(int i=0; in-1;i+) for(int i=0; in-1;i+) for (int j=n-1; ij; j-) for (int j=n-1; ij; j-) char *pj=(char * ) base+j*sz; /bj char *pj=(char * ) base+j*sz; /bj char *pj1=pj-sz; /bj-1 char *pj1=pj-sz; /bj-1 if(*cmp)(pj,pj1)0) if(*cmp)(pj,pj1)0) for( int k=0; ksz; k+) for( int k=0; ksz; k+) char temp=pjk; char temp=pjk; pjk=pj1k; pjk=pj1k; pj1k=temp; 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 strcmp ( * (char *) p, * (char *) q ); 主程序:主程序: #include int main ( ) static int ii = 3,9,5,4; static char * str =compare, the, string ; sort ( ii, 4, sizeof (int), &cmp_int ); sort ( str, 3, sizeof ( char *) , &cmp_str ); coutThe result of sort string:endl; for ( int i=0; i3; i+) coutstr i - 按指按指按指按指针访针访问问成成成成员员。 如:如:如:如:LiMing.Salary=1200.56;LiMing.Salary=1200.56; p-sex=M; p-sex=M;2.5.3 2.5.3 构造、指构造、指构造、指构造、指针针和数和数和数和数组组 构造名构造名构造名构造名 构造数构造数构造数构造数组组名名名名 元素个数元素个数元素个数元素个数 ; 构造名构造名构造名构造名 * *构造指构造指构造指构造指针针名;名;名;名; ex. 10 person company52; ex. 10 person company52; person *pperson=company; person *pperson=company; cout(*(pperson+3).nameendl; cout(*(pperson+3).nameendl;构造中成构造中成构造中成构造中成员员指指指指针针的的的的类类型没有任何限制,可以是根本型没有任何限制,可以是根本型没有任何限制,可以是根本型没有任何限制,可以是根本类类型,也可以是构造,甚至可以定型,也可以是构造,甚至可以定型,也可以是构造,甚至可以定型,也可以是构造,甚至可以定义义援用本身的构造。援用本身的构造。援用本身的构造。援用本身的构造。 ex. 11 struct inode ex. 11 struct inode int data; int data; inode *next; inode *next; ; ;举举例:例:例:例:70%70%的学生的学生的学生的学生经过经过考考考考试试,从,从,从,从键盘输键盘输入学生姓名和成果,按分数高低入学生姓名和成果,按分数高低入学生姓名和成果,按分数高低入学生姓名和成果,按分数高低输输出,出,出,出,并用并用并用并用passpass或或或或failfail表示能否表示能否表示能否表示能否经过经过考考考考试试 ex. 12 #include ex. 12 #include #include #include struct STUDENT struct STUDENT char name30; char name30; int grade; int grade; ; ; void sortclass(STUDENT st , int nst); void sortclass(STUDENT st , int nst); void swap(STUDENT &ps1, STUDENT &ps2); void swap(STUDENT &ps1, STUDENT &ps2); void main( ) void main( ) STUDENT *classes; int ns; STUDENT *classes; int ns; coutns; coutns; classes=new STUDENTns; classes=new STUDENTns; cout“Enter name and grade for each studentn cout“Enter name and grade for each studentn; ; for (int i=0; iclassesi.nameclassesi.grade; for (int i=0; iclassesi.nameclassesi.grade; sortclass(classes, ns); sortclass(classes, ns); const int cutoff=(ns*7)/10-1; const int cutoff=(ns*7)/10-1; for( i=0; ins; i+) for( i=0; ins; i+) coutclassedi.name classi.grade; coutclassedi.name classi.grade; if(i=cutoff) coutpassn; if(i=cutoff) coutpassn; else coutfailn; else coutfailn; void sortclass(STUDENT st , int nst) void sortclass(STUDENT st , int nst) for( int i=0; i(nst-1); i+) for( int i=0; i(nst-1); i+) int pick=i; int pick=i; for(int j=i+1; jnst; j+) for(int j=i+1; jstpick.grade ) pick=j; if( stj.gradestpick.grade ) pick=j; swap(sti, stpick); swap(sti, stpick); void swap(STUDENT &ps1, STUDENT &ps2) STUDENT temp; strcpy(temp.name, ps1.name); temp.grade=ps1.grade; strcpy(ps1.name, ps2.name); ps1.grade=ps2.grade; strcpy(ps2.name, temp.name); ps2.grade=temp.grade; 2.5.5 2.5.5 结结合合合合 union union 结结合名合名合名合名 数据数据数据数据类类型型型型 成成成成员员名名名名1;1; 数据数据数据数据类类型型型型 成成成成员员名名名名2;2; 数据数据数据数据类类型型型型 成成成成员员名名名名n;n; ; ; 成成成成员员1 1、成、成、成、成员员2 2、成成成成员员n n共享内存,共享内存,共享内存,共享内存,编译编译器器器器总总是按是按是按是按结结合中最合中最合中最合中最大成大成大成大成员类员类型分配内存。型分配内存。型分配内存。型分配内存。2.5.6 2.5.6 枚枚枚枚举举一个有名字的整数集合一个有名字的整数集合一个有名字的整数集合一个有名字的整数集合 enum enum 枚枚枚枚举举名名名名 标识标识符符符符1 1,标识标识符符符符2 2, ,标识标识符符符符n n 例如:例如:例如:例如:enum color red, white, black; /red=0, white=1, enum color red, white, black; /red=0, white=1, black=2black=2 color chair; /chair color chair; /chair 的取的取的取的取值值只能是只能是只能是只能是red, whitered, white或或或或blackblack 枚举的运用:枚举的运用: ex. 13 void f( ) ex. 13 void f( ) color suit=white; color suit=white; int i=red; int i=red; suit=i; / suit=i; /错,错, suit=color(i); / suit=color(i); /正确,把整数赋给枚正确,把整数赋给枚举类型要强迫类型转换举类型要强迫类型转换 i=suit; i=suit; suit=4; / suit=4; /错错 在特定时辰,结合只需一个在特定时辰,结合只需一个成员被保管,而不提供其它成员被保管,而不提供其它成员的信息。成员的信息。 标识符的值也可以本人定义: 例如:enum color red, white=7, black=2; 匿名枚举表示一组常量: 例如:enum ASM,AUTO,BREAK; const int ASM=0; const int AUTO=1; const int BREAK=2; 2.5.7 类型定型定义 typedef (为数据数据类型定型定义新新名名 typedef char * STRING; char *str; typedef char (*PFC) (int, char *); PFC f1;STRING str;2.6 构造与函数构造与函数2.6.1 构造用作函数参数和前往构造用作函数参数和前往值 多个成多个成员的参数的参数传送效率低,普通送效率低,普通用构造指用构造指针或援用。或援用。 虽然不允然不允许函数前往数函数前往数组,但前往,但前往整个构造是可以的。效率低的整个构造是可以的。效率低的问题依然依然可可经过指指针或援用途理,但只能用全局或援用途理,但只能用全局变量和静量和静态变量。量。2.6.2 2.6.2 成成成成员员函数函数作函数函数作函数函数作函数函数作为为构造的成构造的成构造的成构造的成员员 成成成成员员函数在构造内定函数在构造内定函数在构造内定函数在构造内定义义缺省是内缺省是内缺省是内缺省是内联联的。也可把成的。也可把成的。也可把成的。也可把成员员函函函函数放在构造外定数放在构造外定数放在构造外定数放在构造外定义义: ex. 14 struct c1 ex. 14 struct c1 char *val; char *val; int i; int i; void print( ); void print( ); ; ; inline void c1:print( ) inline void c1:print( ) coutmember coutmember functionendl;functionendl; 作用域分辨符作用域分辨符
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号