已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章 指针 C程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值 v10.1 指针与指针变量 变量与地址 程序中: int i; float k; 内存中每个字节有一个编号-地址 内存 . 2000 2004 2008 0 i k 编译或函数调用时为其分配内存单元 变量是对程序中数据 存储空间的抽象 . 2000 2008 200C 整型变量i 10 变量i_pointer 2004 指针与指针变量 v指针:变量的地址 v指针变量:专门存放变量地址的变量叫指针变量 2000 指针 指针变量 变量的内容 变量的地址 或 int *i_pointer; i_pointer= 指针变量 变量 变量地址(指针) 变量值 指向 地址存入 指针变量 指针变量 . 2000 2008 200C 整型变量i 20 变量i_pointer 2004 2000 *i_pointer =20i=20 *i_pointer *( float *q ; static char *name; 指针变量名是p1,p2 ,不是*p1,*p2 指针变量只能指向定义时所规定类型的变量 指针变量定义后,变量值不确定,应用前必须先赋值 例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危险或运行出错! 例 main( ) int i=10,k; int *p; p= *p=i; printf(“%d”,*p); 指针变量必须先赋值,再使用 . 2000 2008 200C 整型变量i 10 指针变量p 2004 随机 例 int i; int *p= int *q=p; 用已初始化指针变量作初值 例 main( ) int i; static int *p= () 不能用auto变量的地址 去初始化static型指针 初始值设为零指针 int * p=0; 即 p指向地址为0的单元, 系统保证该单元不作它用 表示指针变量值没有意义 #define NULL 0 int *p=NULL: p=NULL与未对p赋值不同 用途: v避免指针变量的非法引用 v在程序中常作为状态比较 例 int *p; while(p!=NULL) . 例 指针的概念 #include “stdio.h “ main() int a; int *pa= a=10; printf(“a:%dn“,a); printf(“*pa:%dn“,*pa); printf(“ printf(“pa:%x(hex)n“,pa); printf(“ 运行结果: a:10 *pa:10 scanf(“%d,%d“, p1= p2= if(ap2 表示p1指的元素在后 vp1=p2 表示p1与p2指向同一元素 若p1与p2不指向同一数组,比较无意义 p=NULL或p!=NULL 数组名作函数参数 数组名作函数参数显然是传递数组首地址 v数组名作函数参数,实参与形参的对应关系 实参形参 数组名 指针变量 数组名 指针变量 数组名 数组名 指针变量 指针变量 例 将数组a中的n个整数按相反顺序存放 ij 3 7 9 11 0 6 7 5 4 2 0 1 2 3 4 5 6 7 8 9 ijijijji 11760594723 #include “stdio.h “ void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i #define n 10 int main() int caven; for(int j=0;j*y) return x; else return y; #include “stdio.h “ main() int a=2,b=3; int *p; p=f1( printf(“%dn“,*p); . 2000 2010 2014 2004 2008 200C 2 3 指针变量y 指针变量x (f1) 2004 2000 COPY 变量a 变量b (main) 指针变量p * 当调用函数f1()结束时,释放局部变量存储空间 . 2000 2010 2014 2004 2008 200C 2 变量a 变量b (main) 3 指针变量p * 2004 int *f1(int *x,int *y) if(*x*y) return x; else return y; #include “stdio.h “ main() int a=2,b=3; int *p; p=f1( printf(“%dn“,*p); 这第一种方法,正确 例 写一个函数,求两个int型变量中居于较大值的变量的地址 int *f3(int x,int y) if(xy) return else return #include “stdio.h “ main() int a=2,b=3; int *p; p=f3(a, b); printf(“%dn“,*p); . 2000 2010 2014 2004 2008 200C 2 3 变量y 变量x (f3) 3 2 COPY 变量a 变量b (main) 指针变量p * 不能把 函数退出时被销 毁的形参或局部变量 及其地址作函数返回值 . 2000 2010 2014 2004 2008 200C 2 变量a 变量b (main) 3 指针变量p * 2014 int *f3(int x,int y) if(xy) return else return #include “stdio.h “ main() int a=2,b=3; int *p; p=f3(a,b); printf(“%dn“,*p); 这第二种方法,不正确 当调用函数f3()结束时,释放局部变量存储空间 v10.5 函数指针 p355 函数指针:函数在编译时被分配的入口地址,用函 数名表示 max . 指令1 指令2 v函数指针变量赋值:如p=max; 函数返回值的数据类型 专门存放函数入口地址 可指向返回值类型相同的不同函数 指向函数的指针变量 v定义形式: 数据类型 (*指针变量名)(); 如 int (*p)(); 函数指针变量指向的函数必须有函数说明 v函数调用形式: c=max(a,b); c=(*p)(a,b); c=p (a,b); v对函数指针变量pn, p+, p-无意义 ( )不能省 int (*p)() 与 int *p()不同 例 用函数指针变量调用函数,比较两个数大小 main()/以前解法 int max(int ,int); int a,b,c; scanf(“%d,%d“, c=max(a,b); printf(“a=%d,b=%d,max=%dn“,a,b,c); int max(int x,int y) int z; if(xy) z=x; else z=y; return(z); #include “stdio.h “ main() int max(int ,int), (*p)(); int a,b,c; p=max; scanf(“%d,%d“, c=(*p)(a,b); printf(“a=%d,b=%d,max=%dn“,a,b,c); int max(int x,int y) int z; if(xy) z=x; else z=y; return(z); 用函数指针变量作函数参数 例 用函数指针变量作参数,求最大值、最小值和两数之和 #include “stdio.h “ void main() int a,b,max(int,int), min(int,int),add(int,int); void process(int,int,int (*fun)(); scanf(“%d,%d“, process(a,b,max); process(a,b,min); process(a,b,add); void process(int x,int y,int (*fun)() int result; result=(*fun)(x,y); printf(“%dn“,result); max(int x,int y) printf(“maxprintf(“max=”);=”); return(xy?x:y); return(xy?x:y); min(int x,int y) printf(“minprintf(“min=”);=”); return(x成员名结构体变量名.成员名 指向运算符 优先级: 1 结合方向:从左向右 例 指向结构体的指针变量 #include “stdio.h “ main() struct student long int num; char name20; char sex; float score; stu_1,*p; p= stu_1.num=89101; strcpy(stu_1.name,“Li Lin“); p-sex=M; p-score=89.5; printf(“nNo:%ldnname:%snsex:%cnscore:%fn“, (*p).num,p-name,stu_1.sex,p-score); 例 int n; int *p= *p=10; n=10 struct student stu1; struct student *p= stu1.num=101; (*p).num=101 指向结构体数组的指针 例 指向结构体数组的指针 #include “stdio.h “ struct student int num; char name20; char sex; int age; stu3=10101,“Li Lin“,M,18, 10102,“Zhang Fun“,M,19, 10104,“Wang Min“,F,20; main() struct student *p; for(p=stu;pnum, p- name,p-sex,p-age); num name sex age stu0 p stu1 stu2 p+1 例 时间结构体指针 #include “time.h“ time_t t=time(NULL); /or: time_t t; time( /格林尼治时间1970-1-1 00:00:00到当前时间的秒数,long int /Convert t to structure type struct tm *tblock=localtime( printf(“%02d:%02d:%02d“, tblock-tm_hour,tblock-tm_min,tblock-tm_sec); /*Other members are: tm_year=当前年份1900 tm_mon in 011, tm_mday in 131, tm_wday in 06 tm_yday in 0365 is 这一天在本年中是第几天 */ 用指向结构体的指针作函数参数 v用结构体变量的成员作参数-值传递-效率低 v用指向结构体变量或数组的指针作参数-地址传递 #include “stdio.h “ struct data int a, b, c; ; main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c); printf(“Call Func()n“); func( printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c); void func(struct data *parm) printf(“parm-a=%d parm-b=%d parm-c=%dn“,parm-a,parm-b,parm-c); printf(“Process.n“); parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(“parm-a=%d parm-b=%d parm-c=%dn“,parm-a,parm-b,parm-c); printf(“Return.n“); arg a :18 b: 5 c :90 (main) arg a :27 b: 3 c :30 (main) 例 用结构体指针变量作函数参数 arg a :27 b: 3 c :30 (main) (func) parm * arg a :18 b: 5 c :90 (main) (func) parm * 例p365 Inventory Updating: The price and quantity of items stocked in a store changes every day. They may either increase or Decrease. The program reads the incremental values of price and quantity and computes the total value of the items in stock. The program illustrates the use of structure pointers as function parameters. float price; int quantity; ; void main() void update(struct stores *, float, int); float mul (struct stores *stock); float p_increment, value; int q_increment; struct stores item = “XYZ“, 25.75, 12; struct stores *ptr = printf(“nInput increment values:“); printf(“ price increment scanf(“%f%d“, update( printf(“Updated values of itemnn“); printf(“Name :%sn“,ptr-name); printf(“Price :%fn“,ptr-price); printf(“Quantity :%dn“,ptr-quantity); value = mul( printf(“nValue of the item = %fn“, value); void update(struct stores *product, float p, int q) product-price += p; product-quantity +=q; float mul (struct stores *stock) return(stock-price * stock-quantity); v10.7 指针数组和多级指针 用于处理二维数组或多个字符串 指针数组 v定义:数组中的元素为指针变量 v定义形式:存储类型 数据类型 *数组名数组长度说明 ; 例 int *p4; 指针所指向变量的数据类型指针本身的存储类型 区分int *p4与int (*p)4 v指针数组赋值与初始化 赋值: main() int b23,*pb2; pb0=b0; pb1=b1; int *pb2 pb0 pb1 int b23 1 2 3 2 4 6 初始化: main() int b23,*pb =b0,b1; int *pb2 pb0 pb1 int b23 1 2 3 2 4 6 v指针数组赋值与初始化 L i s p 0 F o r t r a n 0 B a s i c 0 p0 p1 p2 p30 赋值: main() char a=“Fortran“; char b=“Lisp“; char c=“Basic“; char *p4; p0=a; p1=b; p2=c; p3=NULL; 或: main() char *p4; p0= “Fortran“; p1= “Lisp“; p2= “Basic“; p3=NULL; 初始化: main() char *p=“Fortran“, “Lisp“, “Basic“,NULL; L i s p 0 F o r t r a n 0 B a s i c 0 p0 p1 p2 p30 char name59=“gain”,“much”,“stronger”, “point”,“bye”; char *name5=“gain”,“much”,“stronger”, “point”,“bye”; g a i n 0 s t r o n g e r 0 p o i n t 0 m u c h 0 name0 name1 name2 name3 name4 b y e 0 g a i n 0 s t r o n g e r 0 p o i n t 0 m u c h 0 b y e 0 v二维数组与指针数组区别: 二维数组存储空间固定 字符指针数组相当于可变列长的二维数组 分配内存单元=数组维数*2+各字符串长度 指针数组元素的作用相当于二维数组的行名 但指针数组中元素是指针变量 二维数组的行名是地址常量 #include “stdio.h “ main() int b23,*pb2; int i,j; for(i=0;i0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0 name1 name2 name3 name4 name Great Wall FORTRAN Computer Follow me BASIC 多级指针 v定义: 指向指针的指针 v一级指针:指针变量中存放目标变量的地址 p1 int *p2; int i=3; p2= p1= *p1=5; v二级指针:指针变量中存放一级指针变量的地址 例 int *p; int i=3; p= *p=5; 例 int i, *p; p= ()/p是二级指针,不能用变量地址为其赋值 指针本身的存储类型最终目标变量的数据类型 *p是p间接指向对象的地址 *p是p间接指向对象的值例 int i=3; int *p1; int *p2; p1= p2= *p=5; i p1 p2 3 char *name=“hello“,“good“,“world“,“bye“,“; p=name+1; printf(“%o : %s “, *p,*p); p+=2; while(*p!=NULL) printf(“%sn“,*p+); name0 name1 name2 name3 name4 char *name5 world bye 0 hello good name p 运行结果: 644 : good bye 用*p可输出地址(%o或%x), 也可用它输出字符串(%s) p *(p+) v二级指针与指针数组的关系 int *p 与 int *q10 指针数组名是二级指针常量 p=q; p+i 是qi的地址 指针数组作形参,int *q 与int *q完全等价;但作为变量定义 两者不同 系统只给p分配能保存一个指针值的内存区;而给q分配10块内 存区,每块可保存一个指针值 动态分配二维数组 vANSI C: int m=3,n=4; int *array; array=(int *)malloc(sizeof(int *) *m); for(i=0;i copy.exe source.c temp.c 有3个字符串参数的命令行 命令行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024上海市高压供用电合同
- 2024安徽省集体合同条例
- 2024个人之间借款合同参考范本
- 2024【挖机转让协议合同范本】出租车转让协议合同范本
- 2024小区门卫劳动合同范本
- 深圳大学《游戏发行的商业实战》2021-2022学年第一学期期末试卷
- 写字楼物业停电应急预案(9篇)
- 关于新学期学习计划范文集合七篇
- 眼镜店开荒保洁施工合同
- 体育学校租赁协议
- 小学英语竞赛试卷(含答案)
- 孤残儿童护理理论知识考试题库及答案
- 2024年兴业银行股份有限公司校园招聘考试试题及参考答案
- 2024年计算机软考(初级)网络管理员考试题库大全(含真题等)
- 小学生必背古诗“飞花令”200句
- 大班幼儿学情分析报告
- 北师大版三年级数学上册第六单元《乘法》(大单元教学设计)
- 纺织品购销合同(5篇)
- 体育市场营销智慧树知到期末考试答案章节答案2024年西华大学
- 【课件】第15课+权力与理性-17、18世纪西方美术+课件-高中美术人教版(2019)美术鉴赏
- 儿童早期的认知发展-皮亚杰前运算阶段(三座山实验)
评论
0/150
提交评论