版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7讲 指针第五章 指针 指针运算是地址的运算( T *px) px+n, px-n 将指针从当前位置向前或向后移动n个数据单位,而不是n个字节。 这取决于指针所指向的数据类型(T)。 pxn的结果为: pxnsizeof(T) px-py求出的是两指针位置之间的数据个数,而不是地址差。 px-py的结果为:( px-py) / sizeof(T) y= px+y= ( px+ ), 注意优先级和结合顺序 y= + pxy= ( + px) 问题:y= px+和y= (px)+的意义struct student int number; char name4;student *pst;5.1 指
2、针及其运算 5.1.1 指针的算术运算pstpst=pst+1; 5.1.3 指针的关系运算 是对两个相同类型的指针的运算,如pxpy,当px所指位置在py之前时,表达式的值为 1,否则为0。px=0, px!=0用来判断px是否为空指针。 不同类型的指针以及指针和一般整数间的关系运算是无意义的。 5.1.4 指针的赋值运算 赋的值必须是地址常量或变量,而不能是普通整数,有以下几种形式: 1. 变量地址赋予指向相同数据类型的指针 char c, *pc; pc=&c; 2.指针赋予相同数据类型的另一指针 int *p, *q; p=q; 3.其它形式 int *p, *q, n; p=q+n;
3、 p+=n;5.2 指针和数组 5.2.1 指针与数组的关系 可以用指针代替数组下标来访问数组: f ( ) int a5; int *pa; *(pa+3)=10; pa3=10; *(a+3)=10; a3=10; 指针与数组的差异:指针是地址变量,可任意改变它的值;而数组名是地址常量,其值不能改变。 5.2.2 字符指针与字符数组 可用字符数组表示字符串,也可用字符指针指向字符串的首址。 指针表示字符串可以赋多个串值,只要将字符串的首址赋给它。 字符数组是常量不能赋值。 ex. 1 include main ( ) static char str =“string”; char *ps;
4、 ps=str; while ( *ps !=0) cout*ps; ps+; coutendl; 5.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; 5.3 指针和函数 5.3.1 指针函数(指针作为函数的返回值) 存储类型 数据类型 * 函数名(参数表) ex. 3 char
5、 *string_name ( int n ) char * string = “illegal string”, “string 1”, “string 2”, “string 3” return ( n3 ) ? string0: stringn; static 返回的是变量地址,必须保证函数返回后,这个变量仍然存在。要返回函数中局部变量的地址,应声明为静态的。 问题: char sname20; sname=string_name(n); 5.3.1 函数指针(函数的入口地址可赋给指针) 虽然函数不是变量,仍占存储空间,此空间的首地址函数入口地址。 存储类型 数据类型 (* 函数指针名)
6、(参数表) ex. 4 int (*fp) ( char ); /fp为一函数指针, 此函数 的返回值为int,参数为char 要将函数指针指向一具体的函数,用赋值语句: ex. 5 int f( char ); fp=f; 与普通变量指针不同,函数指针指向程序代码区,而不是数据存储区。 int i= (*fp) (a); int i=f (a) ; 要保证函数指针的参数和返回值与所指向的函数正好匹配。 ex. 6 void (*fp) ( char * ); void f1(char * ); int f2( char * ); void f3( int * ); void f( ) fp=
7、&f1; fp=&f2; fp=&f3; (* fp) (“asdf”); (* fp) (1); int i=(*fp) (“qwer”); C+不能把函数当作参数传递,但传递函数指针允许。 ex. 7 void sort ( void * base, unsigned int n, unsigned 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; /bj ch
8、ar *pj1=pj-sz; /bj-1 if(*cmp)(pj,pj1)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; i
9、nt 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 ); cout“The result of sort string:”end
10、l; for ( int i=0; i3; i+) coutstr i 按指针访问成员。 如:LiMing. Salary=1200.56; p-sex=M; 5.5.3 结构、指针和数组 结构名 结构数组名元素个数; 结构名 *结构指针名; ex. 10 person company52; person * pany; cout(*(pperson+3).nameendl;结构中成员指针的类型没有任何限制,可以是基本类型,也可以是结构,甚至可以定义引用自身的结构。 ex. 11 struct inode int data; inode *next; ;举例:70%的学生通过考试,从键盘输入学
11、生姓名和成绩,按分数高低输出,并用pass或fail表示是否通过考试 ex. 12 #include #include struct STUDENT char name30; int grade; ; void sortclass(STUDENT st , int nst); void swap(STUDENT &ps1, STUDENT &ps2); void main( ) STUDENT *classes; int ns; coutns; classes=new STUDENTns; cout“Enter name and grade for each studentn”; for (i
12、nt i=0; classesi.grade; sortclass(classes, ns); const int cutoff=(ns*7)/10-1; for( i=0; ins; i+) “ “classi.grade; if(i=cutoff) cout“passn”; else cout“failn”; void sortclass(STUDENT st , int nst) for( int i=0; i(nst-1); i+) int pick=i; for(int j=i+1; jstpick.grade ) pic
13、k=j; swap(sti, stpick); void swap(STUDENT &ps1, STUDENT &ps2) STUDENT temp; strcpy(, ); temp.grade=ps1.grade; strcpy(, ); ps1.grade=ps2.grade; strcpy(, ); ps2.grade=temp.grade; 5.5.5 联合 union 联合名 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; ; 成员1、成员2、成员n共享内存,编译器
14、总是按联合中最大成员类型分配内存。 5.5.6 枚举(一个有名字的整数集合) enum 枚举名 标识符1,标识符2, ,标识符n 例如:enum color red, white, black; /red=0, white=1, black=2 color chair; /chair 的取值只能是red, white或black 枚举的使用: ex. 13 viod f( ) color suit=white; int i=red; suit=i; /错, suit=color(i); /正确,把整数赋给枚举类型要强制类型转换 i=suit; suit=4; /错 在特定时刻,联合只有一个成员
15、被保存,而不提供其它成员的信息。 标识符的值也可以自己定义: 例如:enum color red, white=7, black=2; 匿名枚举表示一组常量: 例如:enum ASM,AUTO,BREAK; const int ASM=0; const int AUTO=1; const int BREAK=2; 5.5.7 类型定义 typedef (为数据类型定义新名) typedef char * STRING; char *str; typedef char (*PFC) (int, char *); PFC f1;STRING str; 5.6 结构与函数 5.6.1 结构用作函数参数和返回值 多个成员的参数传递效率
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026学年宁夏回族自治区银川市五年级语文期末自我评估高频易错题详细参考解析详细答案和解析
- 2026年陕西省电子工业厅四零九职工医院医护人员招聘笔试备考题库及答案解析
- 2025年陕西省中西医结合医院医护人员招聘笔试试题及答案详解
- 2026年天津华兴医院医护人员招聘笔试备考题库及答案解析
- 2025年天津碱厂医院医护人员招聘笔试试题及答案详解
- 2026年长岭炼油公司职工医院医护人员招聘笔试备考题库及答案解析
- 2025年徐州市九里区九里医院医护人员招聘笔试试题及答案详解
- 2025年三原县同城医院医护人员招聘笔试试题及答案详解
- 身份要素在共同犯罪中的多维度审视与司法适用探究
- 2025年武汉市武昌区第一医院医护人员招聘笔试试题及答案详解
- 数据中心DCIM技术系统培训
- 2026湖北荆州市监利市沛然供水有限公司考试聘用人员8人笔试参考题库及答案详解
- 2026广西北海市市场监督管理局招聘后勤人员控制数2人笔试备考试题及答案详解
- 2025年新疆维吾尔自治区克拉玛依市八年级地生会考真题试卷(+答案)
- 河南省开封市2026届九年级中考二模历史试卷(有答案)
- 2026云南昆明昆明晋宁产业园区运营管理有限公司员工招聘4人笔试参考题库及答案解析
- 小升初2025~2026学年浙江省宁波市鄞州区(人教版)数学考试试题 含答案
- 第十一章盐土和碱土
- 五年级下数学水中浸物问题20道pdf
- 2026广东广州花都城投住宅建设有限公司第二次招聘项目用工人员4人笔试历年典型考点题库附带答案详解
- 2026年超星尔雅星海求知-天文学的奥秘必背题库及答案详解(有一套)
评论
0/150
提交评论