6项目六 指针及其应用《C语言程序设计上机指导》.doc
项目六 指针及其应用 【实验内容、步骤】【实验内容、步骤】 1、检查所用计算机是否已经安装 Visual C 2012。 2、进入 Visual C 2012 的工作环境。 3、编程示例,观察与验证输入并运行下面的程序,分析运行结果。 【任务实施】【任务实施】 实验实验 6-1 指针变量定义、赋值、运算示例指针变量定义、赋值、运算示例 源程序源程序 6-1 include void mainvoid int a3,*p; p printf“ad,*pdn”,a,*p; *p10; printf“ad,*pdn”,a,*p; printf“Enter a”; scanf“d”, printf“ad,*pdn”,a,*p; *p; printf“ad,*pdn”,a,*p; printf“d,dn”,* 执行源程序后,得到以下运行结果 图 6-1-1 运行结果图 提示 我们在编辑源代码是要特别注意*p这一句作用相当于 int *p; p 两 句,这句话的意思是定义一个 int 类型指针,然后用 a 的地址给 p 赋值;对于指针 p 来说, *p 就是指针 p 所指向的内存空间存储的值, *pa 就是把 p 所指向的那一内存空间的值赋值为 a,p 本身不改变。 p”,如果去掉,会产生什么结果呢 去掉“p”运行错误如下warning C4700 图 6-1-2 错误提示图 原因很显然使用了未初始化的局部变量“p”。 若第九行语句“scanf“d”,”能改成“scanf“d”,p;”会出错吗 答案是不会出错,两个表达式可以互换,因为 p 是一个指向变量 a 的一个地址指针。 改成 scanf“d”,p之后与原句功能相同。 我们再来测试,若第十一行语句“*p;”,如果去掉括号变成“*p;”会产生 什么结果 大家可以通过以下两个运行结果图进行比较 图 6-1-3 运行结果图(1) 图 6-1-3 运行结果图(2) 之所以有如此差别是因为去掉括号后自加的不是指向地址内的值,而是改变了指针所 指向的地址单元。所以*p的值不是指向 int a51,2,3,4,5; ptra; forn0;n main char s100,*ps; int c40; getsp; while*p if*pA char p; int i; pa4; fori4;i0;i printf“sn”,*p; 运行后本源程序的运行结果如下图所示 图 6-4-1 运行结果图 本 程 序 的 关 键 点 , 第 9 行 “ printf“sn”,*p; ” 大 家 思 考 下 若 改 成 “printf“sn”,p;” 是否还能运行成功呢我们已经学习过因为p 所取的 值为指针 p 的地址值,并非是指针所指向的字符串地址。所以改动后运行结果如下图所示 图 6-4-2 错误提示图 【任务考核】【任务考核】 从传入的从传入的 num 个字符中找出最长的一个字符串, 并通过形参指针个字符中找出最长的一个字符串, 并通过形参指针 max 传回该串地址传回该串地址 (用(用作为结束输入的标志)。作为结束输入的标志)。 源程序源程序 6-5 include include char *funchar *a,int num,char *max int i0 maxa0 fori0;i0 else if *psn”,i,day_namei; char *day_nameint n static char *name“Illegal day”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”, “Sunday”; returnn7 name0namen; 分析本例中定义了一个指针型函数 day_name,它的返回值指向一个字符串。该函 数中定义了一个静态指针数组 name。name 数组初始化赋值为八个字符串,分别表示各 个星期名及出错提示。形参 n 表示与星期名所对应的整数。在主函数中,把输入的整数 i 作为实参,在 printf 语句中调用 day_name 函数并把 i 值传送给形参 n。day_name 函 数中的 return 语句包含一个条件表达式,n 值若大于 7 或小于 1 则把 name0指针返回 主函数,输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函 数中的第 7 行是个条件语句, 其语义是, 如输入为负数i0kj; ifki ptnamei; nameinamek; namekpt; void printchar *name,int n int i; fori0;i main printf“dn”,NULL; 程序运行后输出的结果是 。 A0 B1 C-1 DNULL 没有定义,出错 11已定义以下函数 funint *p return *p; 该函数的返回值是 。 A不确定的值 B形参 p 中存放的值 C形参 p 所指存储单元的值 D形参 p 的地址值 12有以下程序 void funchar *c,int d *c*c1;dd1; printf“c,c,”,4c,d; main char aA,ba; fun printf“c,cn”,a,b; 程序运行后的输出结果是。 AB,a,B,a Ba,B,a,B CA,b,A,b Db,B,A,b 二、填空题二、填空题 1以下程序通过函数指针 p 调用函数 fun,请在空格处写出定义变量 p 的语句。 void funint *x,int *y main int a10,b20; ; /*定义变量 p*/ pfun;p 2以下程序的输出结果是 。 void funint *n while*n printf“d”,*n; main int a100; fun 3以下程序的输出结果是 。 main int arr 30,25,20,1 5,10,5, *parr; p; Printf“dn”,*p3; 4以下程序的输出结果是 。 include main char *p”abcdefgh”,*r; long *q; q long*q; q; rchar*q; printf“sn”,r; 5以下程序的运行结果是 。 include main static int x 1,2,3; int s,i,*p; s1;px; fori0;i3;i s**pi; printf“dn”,s; 【任务考核答案】【任务考核答案】 分析改错分析改错 (1)第 24 行 funss,n,ps函数调用时,参数 ss 为二维数组名,请分析第 3 行 fun 函数的形参,对第 3 行进行修改。 (2)第 14 行定义了字符指针 ps,却没有给 ps 赋值而直接使用了,分析这样会有什 么影响,对 14 行进行修改。 如果声明了指针变量,没有对其进行赋值,将形成一个空指针。空指针所指向的地址是 不可预见的,可能造成程序的崩溃。 给指针赋值 (3)第 18 行循环条件为字符串的直接比较,分析字符串能直接比较吗,对 18 行进 行修改。 不能直接比较,字符串要用字符串比较函数 strcmp 进行判断。