已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章 指针第一部分 知识训练【知识要点】1. 地址与指针 指针变量的概念:用一个变量专门来存放另一个变量的地址。2. 指向变量的指针变量指针变量的形式:基类型 *指针变量名;&: 取地址运算符;*:指针运算符。3. 指针与数组 引用一个数组元素可以用下标法和指针法;可以用数组名作函数的参数。4. 指针与函数函数指针变量定义的一般形式为:类型说明符 (*指针变量名)(); 一个函数的返回值可以是一个函数。【典型习题与解析】5.char * const p;char const * pconst char *p上述三个有什么区别?【解析】char * const p; /常量指针,p的值不可以修改;char const * p;/指向常量的指针,指向的常量值不可以改;const char *p; /和char const *p。6.main()int a5=1,2,3,4,5;int *ptr=(int *)(&a+1);printf(%d,%d,*(a+1),*(ptr-1); 输出结果是什么?【解析】答案:输出:2,5*(a+1)就是a1,*(ptr-1)就是a4,执行结果是2,5。&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)。int *ptr=(int *)(&a+1);则ptr实际是&(a5),也就是a+5。原因如下:1) &a是数组指针,其类型为 int (*)5;而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。2) a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a5,但是prt与(&a+1)类型是不一样的(这点很重要),所以prt-1只会减去sizeof(int*)a,&a的地址是一样的,但意思不一样。3) a是数组首地址,也就是a0的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a1,&a+1是下一个对象的地址,即a5。【练习题】一、填空题1. 指针变量是把内存中另一个数据的 作为其值的变量。2. 能够直接赋值给指针变量的整数是 。3. 如果程序中已有定义:int k;1)定义一个指向变量k的指针变量p的语句是 。2)通过指针变量,将数值6赋值给k的语句是 。3)定义一个可以指向指针变量p的变量pp的语句是 。4)通过赋值语句将pp指向指针变量p的语句是 。5)通过指向指针的变量pp,将k的值增加一倍的语句是 。4. 当定义某函数时,有一个形参被说明成int *类型,那么可以与之结合的实参类型可以是 、 等。5. 以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为:556,则输出十进制整数366。请填空。#include main( ) char *p,s6; int n; p=s; gets(p); n=*p-0; while( != 0)n=n*8+*p-0; printf(%d n,n); 二、选择题1变量的指针,其含义是指该变量的( )。 A)值 B)地址 C)名 D)一个标志2下面程序的运行结果是( )。 #include #include main() char *s1=AbDeG; char *s2=AbdEg; s1+=2;s2+=2; printf(%dn,strcmp(s1,s2); A)正数 B)负数 C)零 D)不确定的值3若有以下定义,则对a数组元素的正确引用是( )。int a5,*p=a;A)*&a5 B)a+2 C)*(p+5) D)*(a+2)4若有以下定义,则p+5表示( )。int a10,*p=a;A)元素a5的地址B)元素a5的值C)元素a6的地址D)元素a6的值5. 以下Delblank函数的功能是删除字符串s中的所有空格(包括Tab、回车符和换行符)。void Delblank(char *s) int i,t;char c80;for(i=0,t=0; ;i+)if(!isspace( )ct+=si;ct=0;strcpy(s,c); A) si B) !si C) si=0 D) si=0 A) s+i B) *ci C) *(s+i)=0 D) *(s+i)6. 以下conj函数的功能是将两个字符串s和t连接起来。char *conj(char *s,char *t) char *p=s;while(*s) ;while(*t)*s= ;s+;t+;*s=0; ; A) s- B) s+ C) s D) *s A) *t B) t C) t- D) *t+ A) return s B) return t C) return p D) return p-t7. 下列程序的输出结果是( )。#include main()int *k,*a,b=100;a=&b; k=&a;printf(“%dn”,*k);A) 运行出错 B) 100 C) a的地址 D) b的地址8. 若定义了以下函数:void f()p=(double *)malloc(10*sizeof(double);p是该函数的形参,要求通过p把动态分配存储单元的地址传回主调函数,则形参p的正确定义应当是( )。A) double *pB) float *p C) double *p D) float *p三、编程题1. 编写一个程序,将用户输入的字符串中的所有数字提取出来。2. 通过指针处理下面的问题:利用随机函数模拟产生 300 个 112 月出生的人数,统计各月所占的出生率。【练习题参考答案】一、填空题1. 首地址 2. 0 3. 1)int *p=&k; 2)*p=6; 3)int *pp; 4)pp=&p; 5)(*pp)*=2;4. 整型数组名、指向整型数据的指针值 5. *(p+)二、选择题1. B 2. B 3. D 4. A 5. BD 6. BAC 7. B 8. C三、编程题1. 编写一个程序,将用户输入的字符串中的所有数字提取出来。#include #include void main()char string81,digit81;char *ps;int i=0;printf(enter a string:n);gets(string);ps=string;while(*ps!=0)if(*ps=0 & *ps=9)digiti=*ps;i+;ps+;digiti=0;printf(string=%s digit=%sn,string,digit);2. 通过指针处理下面的问题:利用随机函数模拟产生 300 个 112 月出生的人数,统计各月所占的出生率。#include #include #include int main(int argc, char* argv) int month12,*m_pt,im_pt=monthsrand( (unsigned)time( NULL ) ) /srand()函数产生一个以当前时间开始的随机种子for (i=0i12i+)*(m_pt+i)=0for (i=0i300i+)(*(m_pt+rand()%12) +printf(月份 出生人数 出生率 (总数300)n)for (i=0i*pb) /第一个数和第二个数比较8 t=*pa*pa=*pb*pb=t /两个数交换9 if (*pb*pc) /第二个数和第三个数比较10 t=*pb*pb=*pc*pc=t 11 if (*pc*pd) /第三个数和第四个数比较12 t=*pc*pc=*pd*pd=t 13 if (*pa*pb) /第一个数和第二个数比较14 t=*pa*pa=*pb*pb=t 15 if (*pb*pc) /第二个数和第三个数比较16 t=*pb*pb=*pc*pc=t 17 if (*pa*pb) /第一个数和第二个数比较18 t=*pa*pa=*pb*pb=t 19 printf(n 排序结果如下:)20 printf(%d,%d,%d,%dn,*pa,*pb,*pc,*pd )21 问题 1:将程序修改为由大到小顺序输出。提示:将程序第 7、9、11、13、15、17 行的“”号。问题 2:完成题目的第二部分提示:对上面的程序作如下修改:1、打开字符串处理函数的头文件在第 1 行下面增加 1 行 #include string.h2、将整型变量改为字符串变量第 3、4 行改为:char a100,b100,c100,d100,t100char *pa=a,*pb=b,*pc=c,*pd=d3、将输入整数改为输入字符串第 6 行改为:scanf(%s%s%s%s,pa,pb,pc,pd)4、将整数比较大小改为字符串比较大小第 7、9、11、13、15、17 行中原比较整数大小使用字符串比较函数来比较,如第 7 行改为:if (strcmp(pa,pb)0)5、将整数赋值改为字符串拷贝第 8、10、12、14、16、18 行中整数赋值改为使用字符串拷贝函数,如第 8行第 1 个赋值语句改为:strcpy(t,pa)6、将整数输出改为字符串输出第 20 行改为:printf(n%sn%sn%sn%snn,pa,pb,pc,pd )2. 完善程序,要求使用函数功能:将一个数字字符串转换成一个整数(不得调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。#include #include long fun(char *p)填写程序void main()char s6;long n;printf(Enter a string:n);gets(s);n=fun(s);printf(%ldn,n);3. 分析下列程序(1)#includemain() char a10=”123456789”,*p; p=a; puts(p); (2) #includemain() int max,x,y,*p1,*p2; printf(“Input x and y:”); scanf(“%d%d”,&x,&y);p1=&x; p2=&y; if(*p1*p2) max=*p1; else max=*p2; prin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重要商业伙伴关系建立通知(3篇)范文
- 2026四川雅安市名山区茗投产业集团有限公司招聘下属公司合同制员工23人考前冲刺密卷附参考答案详解【黄金题型】
- 2026云南昆明技师学院招募银龄技师19人模拟试卷及完整答案详解【夺冠系列】
- 2026江苏南京大学商学院徐小林课题组校内外招聘1人考前冲刺试卷附参考答案详解【综合卷】
- 2026广西河池市宜州区人民医院招聘编外聘用人员19人备考题库及完整答案详解(全优)
- 2026南京审计大学金审学院招聘人员7人备考题库含答案详解(巩固)
- 2026广西贺州市平桂区重大项目建设服务中心见习生招聘3人考前冲刺密卷(原创题)附答案详解
- 2026安徽合肥市某机关单位岗位招聘考前冲刺试卷附答案详解【满分必刷】
- 2026广东艺术职业学院招聘青年博士及骨干教师64人笔试题库含答案详解【培优】
- 2026浙江宁波市北仑区人民医院招聘编外(药剂师、健康管理中心)人员2人模拟试卷【突破训练】附答案详解
- 2025年艾草种植可行性研究报告
- 炸鸡店的员工奖惩制度梳理
- 整式的乘除易错题(14考点40题)解析版-2024-2025学年北师大版七年级数学下册
- 出入库登记表模板
- 人教版五年级下册语文期末考试题
- 护士沟通技巧与人文关怀护理课件
- 一例脊髓损伤患者的护理查房
- DL/T 5155-2016 220kV~1000kV变电站站用电设计技术规程
- 《磁法勘探》07 第七章 磁异常的处理与转换
- NB-T 10942-2022 10kV及以下有源型电压暂降治理设备通用技术要求
- GB/T 2005-1994冶金焦炭的焦末含量及筛分组成的测定方法
评论
0/150
提交评论