字符串与指针

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5· 指针做函数的参数 5
[本段任务] 掌握用指针作为函数参数编程的方法。 在本章第三节3· 函数调用时参数传递方式这一段,我们 2 讨论过函数的参数呈现有传值方式和传址方式两种。并 介绍了使用数组名做实参,用与实参数组同类型的数组 作形参的方法实现传址方式。通过指针一节的学习,我 们明白了,这样的传址方式其实就是用指针作函数的参 数。在程序当中,凡是需要将一个以上的数据从被调函 数传到主调函数里,必须将函数的参数设为指针变量。 这样设计的目的,是使主调函数和被调函数对应的形、实 参都指向同一个变量,当主调函数实参所指的变量发生 任何改变,或者被调函数对应的形参所指的变量发生任 何改变,本质上都是同一个变量发生的改变。
例4_5_7 已知一个不透明的布袋里装有红、蓝、 黄、绿、紫色的、同样大小的圆球各一个,现 从中一次抓出两个,问可能抓到的是什么颜色 的球?用指针数组类型数据解之。 分析:用一重循环从1~5表示抓到的红、蓝、黄、 绿、紫色的一个球,用另一重循环从1~5表示 抓到的红、蓝、黄、绿、紫色的第二个球。由 于每次抓到的球不可能同色,只要判断两重循 环不能取同一个值,所得的结果为所求。只是 所用的数据类型为指针数组,指针数组的元素 为字符串。
5· 2 用字符串指针访问字符串 4·
输出的一般形式是: printf(“%s”,字符串指针变量名); 输 出 还 可 以 使 用 puts, 输 入 可 以 使 用 gets 或 者 scanf。 %s是字符串所用的格式符,它可以对字符串进 行整体输入、输出,而不必采用循环逐个字符 访问。系统首先访问string所指向的那个字符, 然后使指针string自动加1,指向下一个字符, 然后输出下一个字符,……直到遇到字符串结 束标准’\0’为止。
[ 小结 ]
含指针程序的出错原因 使用指针中最常出错的地方有如下几种:⑴指针未初始化, 指针的值是一个任意的地址值,在程序中给这个指针所 指的单元赋值,就会出现不可预知的错误;⑵指针使用 中超界,其具体原因可能是重复使用指针未复位、对指 针所指的数据的存放位置判断错误等;⑶使用指针时, 将指针指向的数据类型与定义时不一致;⑷使用指针的 格式与C语言规定的相悖。以上种种,都是因为对指针 的格式、功能、语法不够熟悉所致,严格按照C语言的 规定使用指针,就可以避免许多意想不到的麻烦。
5· 指针数组 6
[本段任务] 了解用指针数组进行编程的方法。 一个数组,当它的元素是指针的时候,该数组被称为指针 数组。 定义格式为: 基类型 *数组名[数组元素个数]; 例如:int *a[10]; 是一个可内装10个整形指针的指针数组。 指向指针的指针定义格式: 基类型 **指针名; 例如:int *a[10],**p=a; 这里的p就是一个指向指针的指针。在程序中用*(p+i)可以 得到指针数组a的第i个元素(指针)所指的内容。
/* 4_5L5.C */ main() { char a[20],b[20],*sa,*sb; int i=0; sa=a; sb=b; /*指针变量sa, sb分别指向字符串a,b*/ gets(sa); gets(sb); /*读入单词a,b */ while((*(sa+i)= =*(sb+i))&&*(sa+i)!=’\0’) /*当对应的字母相同且sa指向的单词没到末尾。*/ i++; /* sa、sb指针继续指向下一字母;如果对应 字母不同,循环立即结束*/ if(*(sa+i)= =’\0’&&*(sb+i)= =’\0’) /*循环退出后判断,如果sa、sb指向的单词*/ printf(“%s and %s is same!\n”,sa,sb); /* 同时结束,说明两个单词相同*/ else if(*(sa+i)>*(sb+i)) printf(“max is %s,min is %s\n”,sa,sb); /*如果sa指向的大于sb指向的*/ else printf(“max is %s,min is %s\n”,sb,sa); /*否则说明sb指向的大于sa指向的*/ }
/* 4_5L7.C */ #include"stdio.h" main() { char *color[5]={"red","blue","yellow","green","purple"},**p=color; int s=0,i,j; clrscr(); for(i=0;i<=3;i++) for(j=i+1;j<=4;j++) { if(i==j)continue; s++; printf("%6d",s); printf("%10s %10s\n",*(p+i),*(p+j)); } }
这样设计的目的是使主调函数和被调函数对应的形实参都指向同一个变量当主调函数实参所指的变量发生任何改变或者被调函数对应的形参所指的变量发生任何改变本质上都是同一个变量发生的改变
5· 字符串与指针 4
[本段任务] 掌握指向字符串的指针的定义和用指 针访问字符串。 5· 1 字符串的指针和指针变量 4· 定义字符串指针的一般形式是: char *字符串指针变量名; 初始化字符串指针 可以先定义后初始化: char *字符串指针变量名; 字符串指针变量名=字符串; 也可以在定义的同时初始化: char *字符串指针变量名=字符串;
/* 4_5L6.C */ main() { int Add(int *p); /*函数声明*/ int iScore[10],*ps=&iScore[0]; int i; for(i=0;i<10;i++数据*/ for(i=0;i<10;i++) Add(ps+i); /* 实参依次是每一个数组元素的指针 */ for(i=0;i<10;i++) printf(“%4d ”,*(ps+i)); /*输出数组元素*/ } int Add(int *p) { if(*p>=70) /* 对指针所指的变量判断后进行运算 */ *p=*p+5; else *p=*p+10; return; /*函数返回*/
• 例4_5_6 现有10名学生的成绩。成绩不低于70 分的每人加5分,成绩低于70分的每人加10分。 要求用函数实现,最后在主函数中输出所有成 绩。 • 分析:在主函数中输入原始数据后;每一个数 组元素都要调用一次函数;在函数中进行判断 及相应的操作,然后返回修正后的成绩给主函 数;最后在主函数中输出所有数组元素。
作业和练习(均要求用指针方法处理)
7、一个数组中存放着若干个城市的摄氏温度, 将这些温度转换成华氏温度,存放在另一个 数组中。公式为F=9c/5+32。 8、输入一个二维整型数组,打印成矩阵形式, 再进行转置而后打印之。
下次课再见!
例4_5_5 比较两个单词的大小(单词全部用小写 字母)。按照字典排列法,前面的单词小,后面 的单词大。 分析:定义两个字符串指针,分别指向这两个单词。 然后利用循环结构进行比较,从各自的第1个字 母开始比较,如果两个字母相同,那么各自指针 增1,指向下一个字母,继续比较;如果不同就 可以退出循环,退出循环后比较使循环结束的那 两个字母就可以区分出两个单词谁大谁小;如果 相同循环结束也退出,此时两单词相同。
相关文档
最新文档