资源描述
C语言学习与应用教学课件在本学习任务中,我们将学习指 针变量的定义、赋值和使用,通过若 干应用举例和任务的完成掌握指针在 主函数与函数间的多值传递。知识要求 掌握指针变量的定义方法。掌握指针变量的基类型以及指针变量赋值的方法。了解指针能参与的运算。理解变量的直接访问和间接访问。掌握以形参为指针的自定义函数。能力要求占能够读懂使用指针变量的程序。6能够用指针访问变量。6能够借用指针的灵活地编写程序。占能够调试含指针变量的程序。6能够运用指针灵活地书写函数和主函数。01指针1.变量的地址和指针一个变量实际是代表内存中的某个存储单元,内存是以 字节为单位的一片连续存储空间,每个字节有一个编号,即内存地址,变量的地址就是变量的指针。我们可以通过 两种方式访问变量:一是直接存取方式,即直接按变量的 地址存取变量值;二是间接存取方式,它是先通过某变量 获得变量的地址,再获取变量值。专用于存放地址的变量称为指针变量。指针变量也是变量,要 先定义后使用。为了与一般变量区分开,定义指针变量时要加星号。例如:int*p,*s,k=20;定义了两个指针变量p、s和一个普通变量k 指针移动的最小单位是存储单元,定义时的类型称为基类型。基类型为int的指针变量p,当有p+1时,此处的1表示一个整型的存 储单元(4个字节),只能给p赋整型变量的地址。如有double*q;”,当有q+1时,此处的1表示一个double型的存储单元(8个字 节),只能给q赋double型变量的地址。指针变量也在内存中存放,也有地址。存放指针变量地址的变 量在被定义时要有两个星号,因此在定义指针变量时出现两个以上 的星号是正确的,如“int*t;”。3,给指针变量赋值给指针变量赋值的方法如下。i nt k=20,*p,*q;P=&k;将变量的地址赋给指针变量q=P;在指针变量之间赋值P=NULL 给指针变量赋空值,与p3 0,或p=0等价微课学习任务六指针操作.主函数与函数间的多值传递 悠.胃指针变量赋值一般变量不同,是一个指针变量;二是出现在可执行语句中,星号“钎 是间接运算符,表示该指针对应的变量。例如:int*p,i=10;变量的定义,*p中的星号表示p是指针变量P=&i;为指针变量赋值*p=56;此处*p表示p所指变量i,等价于厂56,星号是间接运算符2)*与&的抵消4.指针变量的操作程序代码“int k,*p;p=&k;”中,*p就是k,即*&k就是k,*与&是抵消的。作为间接运算符的“钎,它的右边只能是地址变量即指针,而&的右边只能 是变量,如写作&*%“*”的右边不是地址变量就错了。另外,还可以在定义指针变量的同时为指针变量赋值。例如:i nt i,*p;P=&i;以上这两句可以合并为一条,int i=10,*p=&i;定义p的同时,给p赋值,即变量的初始化“*P=&i”只能出现在定义语句中。指针的运算L 1.指针变量参与的运算指针变量力口(减)整数指针变量关系运算符指针变量指针变量减指针变量有如下程序代码:int a 10,*p二&a 0,*q二&a 9;则 p+3是&a 3,(q-2)是&a 7*(p+3)是a 3,*(q-2)是a 7。/a 10是数组指针变量参与的运算有如下程序代码。int i=10,*p二&i;则*P就是i,因此“i=i+l;”可写作“*p=*p+l;、“*p+=l;、“+*p;或(*p)+;。而*p+的含义是:获得*pB,执行“p=p+i操作,指针指向下一个存储 单元。应用举例67对地址的理解#include stdio.hvoid main()int a 10,*p=&a 0,*q=&a 9;printff4n%x,%x,%dn,p,q,(q-p);getchar();输出:22ff40,22ff64,9可以看出a 0的地址是22ff40,整型每个变量占四个字节,因此a 9的地址是 22ff40+4*9,将4*9(即36)转换为十六进制数24,于是有22ff40+24,得到a 9 的地址正是22ff64。两个指针相减得到的是两地址间存储单元的个数9。写出以下程序代码的输出 结果。问题6-量写出退下程序代码的输出结果#include Hstdio.hHvoid main()int a,b,*p=&a,*q=&b;a=4,b=3;printf(H%d,%d n”,*p,*q);getchar();输出:.应用举例6-2指针的比较运算#include stdio.hvoid main()int a 10=1,2,3,4,5,6,7,8,9,10,*p=&a 0/q=&a 9;while(q=p)两指针的比较运算printf(%d*q-);先取*q,再执行q=q-lgetchar();)输出:109 876543 2 1从上述程序可以看出,可通过“while(q=p)”来判断指针q是否到达p位置,从 而使指针不断移动位置,把数组a 10由后至前输出。模仿应用举例6-2顺序输出 数组中的各元素。问题2 模仿应用举例6号顺序输出数组中的#include nstdio.hH void main()int a E10=1,2,3,4,5,6,7,8,9,10,*p=&a 0/q=&a 9;while(.)printf(n%d.);getchar();序执行结果:.任务实施任务一指针操作基础训练工作内容及要求:通过若干程序的阅读理解和填空掌握指针在程序设计中的基础应用。编程训练677借用指针变量的数据输入/输出操作。#include stdio.h void main()int x,*p;p=&x;printf(请输入一个整数:);scanf(n%d,.);请勿填写&xprintf(Hx=%d nH,.);请勿填写x编程训练6-1-2借用指针变量实现的按顺序输出数据。include stdio.h void main()int x,y,.;定义两个指针变量pmax和pminprintf(请输入两个整数:);.输入两个整数赋给x和yif(xy)较大值的地址赋pmax屐小值地址赋pmin编程训练else)printf(按由大到小的顺序输出是:%d,%dn,*pmax,*pmin);任务二 主函教与函数间的多值传遹工作内容及要求:通过若干训练掌握指针在函数中的灵活应用。编程训练6-2-1主函数与函数间的值传递。#include stdio.h void swap(int a,int b)int t;t=a;a二b;b=t;)编程训练void main()int x,y;printf(请输入两个数:”);scanf(n%d%dn,&x,&y);printf(66x=%d,y=%dnn,x,y);swap(x,y);printf(,x=%d,y=%dn,x,y);编程训练6-2-2实参是变量的地址。更改训练6-2-1中的程序代码,实参用变量的地址,形参就是能够接收地址的指针变量,将程序代码补 充完整,使程序的运行结果如下。输入:56 78输出:x=56,y=78x=78,y=56编程训练#includenstdio.hvoid swap(.,int*b)形参是指针变量int t;仁*a;此处的*a就是主函数中的x,使主函数中的x,y交换编程训练void main()int x,y;printf(”请输入两个整数:”);scanf(n%d%dn,&x,&y);printf(”x=%d,y=%dn”,x,y);swap(.,&y);实参是变量的地址printf(x=%d,y=%dnn,x,y);)编程训练6-2-3两数和的函数。1)以下函数的功能是返回两数之和,请将主 函数补充完整,运行程序并填写输出内容。#include stdio.hint fun(int a,int b)int t;仁 a+b;return t;)编程训练void main()int x,y,z;printf(请输入两个数:”);printf(n%d+%d=%dn,x,y9.);)输入:5 6输出:.J编程训练6-2-4同时求两数和与两数差,实现主函数与函数间的多值传递。#include stdio.hvoid fun(int a,int b,int*c,int*d)void main()int x,y,zl,z2;2编程训练printf(请输入两个数:);scanf(n%d%du,&x,&y);fun(x,y,.,.);printf(%d+%d=%dn,x,y,z 1);printf(n%d-%d=%dnn,x,y,z2);)输入:5 6输出:tie任务三函数返回值是指针6-3-1阅读理解程序。#include stdio.hint*fmax(int*a,int*b)if(*a*b)return a;else return b;)void main()I_任务三函数返回值是指针int x,y,*p;printf(“请输入两个数:“scanf(n%d%dn,&x,&y);p=fmax(&x,&y);printf(较大数:%dn,*p);输入:5 6输出:.编程训练6-3-2返回较小值的地址#include stdio.hint*fmin(int*a,int*b)void main()scanf(n%d%du,&x,&y);.二.(&x,&y);编程训练6-3-3功能扩充#include stdio.hint*finin(int*a,int*b)void main()编程训练分别输入:56 78 分别输出:7856祝你进步!谢谢!
展开阅读全文