第十章 指针
- 格式:doc
- 大小:166.50 KB
- 文档页数:21
《C语言程序设计》课程教学大纲一、课程教学目的本课程系统研究C语言的基本知识和基本语法,较好地训练学生解决问题的逻辑思维能力以及编程思路和技巧,使学生具有较强的利用C语言编写软件的能力,为培养学生有较强软件开发能力打下良好基础。
二、课程教学要求通过本课程的研究,应熟练掌握C语言中的基本知识、各种语句及程序控制结构,熟练掌握C语言的函数、数组、指针、结构体、链表等数据结构的基本算法;并能熟练地运用C语言进行结构化程序设计;具有较强的程序修改调试能力;具备较强的逻辑思维能力和独立思考能力。
三、课时分配本学科计划学时为246学时,其中理论与实训课时比例为7:3.四、课程教学重、难点课程教学重点:掌握C语言变量类型及不同类型常量的表示;标准的输入输出函数的使用;运算符及常用数学函数的使用;控制流程、数组和指针的使用;结构体、链表的构造使用;函数结构、函数参数传递及递归等方面的知识;基本的文件操作。
难点:指针的使用、结构体链表的构造和使用及函数的参数传递。
五、课程教学方法(或手段)本课程实践性较强,故采用讲授和上机操作相结合的方式进行教学。
六、课程教学内容第一章C言语概述1.教学内容(1)编程历史的回顾、程序设计介绍(过程式,面向对象,函数式,逻辑式);(2) C语言的历史背景、特点;(3) C言语源步伐的格式和步伐结构;(4) C程序的上机步骤。
2.重、难点提醒(1)重点:掌握简单的C程序格式,包括main()函数、数据说明、函数开始和结束标志等;(2)难点:编程入门和对言语的理解。
第二章算法1.教学内容(1)算法的概念及特征;评价算法优劣的方法(时间和空间);(2)简单算法举例;(3)算法的表示(自然语言、流程图、N-S流程图);(4)结构化步伐设计的基本思想及基本步调。
2.重、难点提醒(1)重点:算法流程图三种基本结构(以后各章研究中使用流程图强化对步伐的理解);(2)难点:算法概念和对结构化步伐设计思想的理解。
第十章指针一、选择题1.以下程序的运行结果是【C】。
sub(int x,int y,int *z){*z=y-x ;}main(){ int a, b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf(”%4d,%4d,%4d\n”,a,b,c);}A. 5,2,3 B. -5,-12,-7 C.-5,-12,-17 D. 5,-2,-72.若已定义 char s[10]; 则在下面表达式中不表示s[1]的地址的是【 B 】A)s+1 B)s++ C)&s[0]+1 D)&s[1]3.下列程序能对两个整型变量的值进行交换。
以下正确的说法是【 D】。
main(){ int a=10,b=20;printf("(1)a=%d,b=%d\n",a,b);swap(&a,&b);printf(“(2)a=%d,b=%d\n”a,b);}swap(int p, int q){ int t; t=p;p=q;q=t;}A. 该程序完全正确B. 该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可C. 该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可D. 以上说法都不正确4.有四组对指针变量进行操作的语句,以下判断正确的选项是【】。
(1)int *p,*q; q=p;int a,*p,*q;p=q=&a;(2)int a,*p,*q; q=&a; p=*q;int a=20, *p; *p=a;(3)int a=b=0,* p; p=&a; b=* p;int a=20,*p,*q=&a; *p=*q;(4)int a=20,*p,*q=&a; p=q;int p, *q; q=&p;A.正确:(1);不正确:(2),(3),(4)B.正确:(l),(4);不正确:(2),(3)C.正确:(3);不正确:(1),(2),(4)D.以上结论都不正确5.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是【】。
《C语言程序设计》课程教学大纲一、课程教学目的本课程系统学习 C语言的基本知识和基本语法,较好地训练学生解决问题的逻辑思维能力以及编程思路和技巧,使学生具有较强的利用 C 语言编写软件的能力,为培养学生有较强软件开发能力打下良好基础。
二、课程教学要求通过本课程的学习,应熟练掌握 C 语言中的基本知识、各种语句及程序控制结构,熟练掌握 C 语言的函数、数组、指针、结构体、链表等数据结构的基本算法;并能熟练地运用 C 语言进行结构化程序设计;具有较强的程序修改调试能力;具备较强的逻辑思维能力和独立思考能力。
三、课时分配本学科计划学时为246学时,其中理论与实训课时比例为7:3。
四、课程教学重、难点课程教学重点:掌握C语言变量类型及不同类型常量的表示;标准的输入输出函数的使用;运算符及常用数学函数的使用;控制流程、数组和指针的使用;结构体、链表的构造使用;函数结构、函数参数传递及递归等方面的知识;基本的文件操作。
难点:指针的使用、结构体链表的构造和使用及函数的参数传递。
五、课程教学方法(或手段)本课程实践性较强,故采用讲授和上机操作相结合的方式进行教学。
六、课程教学内容第一章 C语言概述1.教学内容(1) 编程历史的回顾、程序设计介绍(过程式,面向对象,函数式,逻辑式);(2) C语言的历史背景、特点;(3) C语言源程序的格式和程序结构;(4) C程序的上机步骤。
2.重、难点提示(1)重点:掌握简单的 C程序格式,包括main()函数、数据说明、函数开始和结束标志等;(2)难点:编程入门以及对语言的理解。
第二章算法1.教学内容(1) 算法的概念及特性;评价算法优劣的方法(时间和空间);(2) 简单算法举例;(3) 算法的表示(自然语言、流程图、N-S流程图);(4) 结构化程序设计的基本思想及基本步骤。
2.重、难点提示(1)重点:算法流程图三种基本结构(以后各章学习中利用流程图强化对程序的理解);(2)难点:算法概念以及对结构化程序设计思想的理解。
《C语言程序设计》课程教学大纲适用专业信息与计算科学总学时90学分 4一、编写说明(一)本课程的性质、地位和作用本课程属于信息与计算科学的专业课,C程序设计语言的语法规则、数据类型、数据运算、语句、函数、指针、程序结构等方面的学习,掌握应用C语言进行程序设计的技能,为今后进一步学习程序开发以及科学与工程计算的软件开发奠定一个良好的基础。
(二)本大纲制定的依据根据本专业人才的培养目标和人才培养规格所需要的基本理论和基本技能的要求,根据本课程的教学性质、条件和教学实践而制定。
(三)大纲内容选编原则与要求通过对本课程的学习,使学生掌握基本概念、基本原理、基本知识和实际操作能力,重点落实到“用”上。
在对大纲内容选编时,在注重基本原理、基本概念的同时,特别强调实用系统的设计与开发,做到了理论与实践有效结合。
(四)实践环节实验1:C程序的运行环境和运行一个C程序的方法, 2学时主要内容与要求:了解所用的计算机系统的基本操作方法,学会独立使用该系统;了解在该系统上如何编辑、编译、连接和运行一个C程序;通过运行简单的C程序,初步了解C 程序的特点。
实验2:简单的C程序设计,2学时主要内容与要求:掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法;掌握不同类型数值之间赋值的规律;学会使用C的有关算术运算符,以及包含这些运算符的表达式;掌握赋值语句的使用方法;掌握各种类型数据的输入输出方法,能正确使用各种格式转换符。
实验3:逻辑结构、循环控制程序设计,4学时主要内容与要求:了解C语言表示逻辑量的方法;学会正确的使用逻辑运算符和逻辑表达式;熟练掌握if语句和switch语句;熟悉掌握用while 语句,do while语句和for语句实现循环的方法;掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等);进一步学习调试程序。
实验4:数组、函数,4学时主要内容与要求:掌握一维数组和二维数组的定义、赋值和输入输出方法;掌握字符数组和字符串函数的使用;掌握与数组有关的算法(特别是排序算法);掌握定义函数的方法;掌握函数实参与形参的对应关系以及“值传递”的方式;掌握函数的嵌套调用和递归调用的方法;掌握全局变量和局部变量,动态变量、静态变量的概念和使用方法;学习对多文件程序的编译和运行。
C语言基础教程文件和文件指针1.文件一般说来,文件是有序数据的集合。
程序文件是程序代码的有序集合,数据文件是一组数据的有序集合。
文件是被存放在外部存储设备中的信息。
对文件的处理过程就是面向文件的输入和输出过程。
文件的输入过程是从文件中读出信息,文件的输出过程是往文件中写入信息,文件的输入的过程使用读函数,实现文件输出的过程使用写函数。
文件的读写函数是实现文件操作的主要函数,本章将用大量篇幅来讲述文件的读写函数。
C语言文件被称为流式文件,其特点是不分记录或块,将文件看成是信息"流"或看成是一个字符流(文本文件),或看成是一个二进制流(二进制文件).文件的存取是以字符(字节)为单位的,读写数据流的开始和结束受程序控制。
任何一个文件都是以EOF结束,最简单的文件是只有结束符的空文件。
C语言文件包含有设备文件和磁盘文件,例如,键盘是一种输入信息的文件,显示器屏幕和打印机是输出信息的文件它们都属于设备文件。
将内存的信息放到磁盘上保存,需要时再从磁盘上装入内存,这就要使用磁盘文件,磁盘文件是计算机中常用的文件nC语言文件按存放设备分设备文件和磁盘文件;按数据的组织形式分为文本文件(ASCII码文件)和二进制文件。
文本文件是按一个字节存放一个字符的ASCII码来存放的;二进制文件是按数据在内存中的存储形式放到磁盘上的。
例如,有一个整数10000,在内存中按二进制形式存放,占2个字节,将它放在磁盘上如按文本文件形式存放,占5个字节,每个数位占一个字节。
两种存放方式各有利弊。
以文本文件形式输出便于对字符进行处理,也便于输出字符,但是占用存储空间较多,并且要花费转换时间。
以二进制文件形式输出可节省存储空间和转换时间,但是不能直接输出字符形式。
2.文件指针文件指针是一种用来指向某个文件的指针。
如果说某个文件指针指向某个文件,则是该文件指针指向某个文件存放在内存中的缓冲区的首地址。
每一个被使用的文件都要在内存中开辟一个区域,用来存放的有关信息,包括文件名字、文件状态和文件当前位置等。
第十章指针一、选择题1.变量的指针,其含义是指该变量的_______________。
A) 值B) 地址C) 名D)一个标志2.已有定义int k=2; int *ptr1, *ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值是________________。
A)k=*ptr1+*ptr2 B) ptr2=k C) ptr1=ptr2D)k=*ptr1*(*ptr2)3.若有定义int *p, m=5,n;以下程序段正确的是________________。
A) p=&n; B) p=&n;scanf("%d",&p); scanf("%d",*p);C) scanf("%d",&n); D) p=&n;*p=n; *p=m;4.若有定义:int *p1, *p2, m=5, n;以下____________是正确的赋值语句。
A) p1=&m; p2=&p1; B)*p1=*p2; C) p1=&m; p2=p1; D) p1=&m; *p2=*p1; 5.若有int *p, a=4;和p=&a;下面____________均代表地址。
A) a, p, *&a B)&*a, &a, *p C) *&p, *p, &a D)&a, &*p, p6.若变量已正确定义并且指针p已经指向变量x,则*&x相当于____________。
A) x B) p C) &x D) &*p7.若定义了int m, n=0, *p1=&m;则下列____________表达式与m=n等价。
A) m=*p1 B)*p1=&*n C) *&p1=&*n D) *p1=*&n;8. 假如指针p已经指向整型变量x,则(*p)++相当于____________。
A) x++ B) p++ C) *(p++) D) &x++9. 对于基类型相同的两个指针变量之间,不能进行的运算是____________。
A) < B) = C) + D) -10. 若程序中已包含头文件stdio.h,以下选项中正确运用指针变量的程序段是__________。
A) int *i=NULL; B) float *f=NULLscanf("%d",i); *f=10.5;C) char t='m',*c=&t; D) long *L;*c=&t; L='\0';11. 有如下函数和变量定义int a=25; 执行语句print_value(&a);后的输出结果是___________。
void print_value(int *x){ printf("%d",++*x); }A) 23 B) 24 C) 25 D) 2612. 若有定义:char s[10]; 则在下面表达式中不表示s[1]的地址的是___________。
A) s+1 B) s++ C) &s[0]+1 D) &s[1]13.若有定义:int a[5], *p=a; 则对a数组元素的正确引用是_____________。
A)*&a[5]B)a+2 C)*(p+5) D)*(a+2)14. 若有定义:int a[5], *p=a; 则对a数组元素地址的正确引用是_____________。
A)p+5B)*a+1 C)&a+1 D)&a[0]15. 若有定义:int a[5]; 则a数组中首元素的地址可以表示为_____________。
A)&a B)a+1 C)a D)&a[1]16. 若要对a进行合法的自减运算,则之前应有下面___________的说明。
A) int p[3]; B) int k; C) char *a[3]; D) int b[10];int *a=p; int *a=&k; int *a=b+1;17. 以下选项中,________________对指针变量p的操作是正确的。
A) int a[3], *p; B) int a[5], *p;p=&a; p=a;C) int a[5]; D) int a[5], *p1, *p2=a;int *p=a=100; *p2=*p1;18若有定义int x[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p1;则数值不为3的表达式是___________。
A)x[3] B)p1=x+3,*p1++ c) p1=x+2,*(p1++) D) p1=x+2, *++p119. 设int x[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, *p=x, k; 且0≤k≤10,则对数组元素x[k]的错误引用是___________。
A)p+k B)*(x+k) c) x[p-x+k] D) *(&x[k])20. 若有定义int a[3]={ 1, 2, 3}, *p;则下列赋值语句中正确的是___________。
A) p=&a; B) *p=a; C) *(a+1)=a; D) p=a+1;21. 设int b[]={1, 2, 3, 4}, y, *p=b;执行语句y=*p++;后变量y的值为___________。
A) 1B) 2C) 3D) 422. 下面程序段执行后的输出结果是_____。
#include <stdio.h>void main(){int a[]={2, 4, 6, 8, 10}, y=0, x, *p=&a[1];for(x=1; x<3; x++) y+=p[x];pritnf("%d",y);}A) 10B) 11 C) 14 D) 1523.若有定义int a[2][3];则对a数组的第i行第j列元素地址的正确引用是_____。
A) *(a[i]+j) B) (a+i) C) *(a+j) D) a[i]+j24. 若有定义int a[4][6];则能正确表示a数组中任一元素a[i][j](i,j均在有效范围内)地址的表达式是_____。
A) &a[0][0]+6*i+j B) &a[0][0]+4*j+i C) &a[0][0]+4*i+j D) &a[0][0]+6*j+i25. 若有定义int a[3][4];则与元素a[0][0]不等价的表达式是_____。
A) *a B) **a C)*a[0] D) *(*(a+0)+0)26. 若有定义int a=3, b, *p=&a; 则下列语句中___________使b不为3。
A) b=*&a; B) b=*p; C) b=a; D) b=*a;27. 若有定义int t[3][2];则能正确表示t数组元素地址的表达式是_____。
A)&t[3][2]B)t[1][1] C)t[2] D)t[3]28. 若有定义int a[4][5];下列_____引用是错误的。
A) *a B) *(*(a+2)+3) C) &a[2][3] D) ++a29. 若有定义int s[4][5], (*ps)[5]=s;;则对s数组元素的正确引用是_____。
A) ps+1 B) *(ps+3) C) ps[0][2] D) *(ps+1)+330. 若有定义int c[4][5]; (*p)[5]=c;;则能正确引用c数组元素的是_____。
A) p+1 B) p[3] C) p[1]+3 D) *(p[0]+2)31.下面程序执行后的输出结果是___________。
#include <stdio.h>void main(){int a[][4]={1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};int (*p)[4], i=2, j=1;p=a;printf("%d",*(*(p+i)+j));}A) 9 B) 11 C) 17 D) 1932.若有程序段int a[2][3], (*p)[3]; p=a;则对a数组元素地址的正确引用是___________。
A) *(p+2) B) p[2] C) p[1]+1 D) (p+1)+233. 若有程序段int a[2][3], (*p)[3]; p=a;则对a数组元素的正确引用是___________。
A) (p+1)[0] B) *(*(p+2)+1) C) *(p[i]+1) D) p[1]+234.下面程序执行后的输出结果是___________。
#include <stdio.h>void main(){int a[3][3], *p, i;p=&a[0][0];for(i=0; i<9; i++) p[i]=i+1;printf("%d",a[1][2]);}A) 3 B) 6 C) 9 D) 随机值35.若有定义int (*p)[4]; 则标识符p___________。
A) 是一个指向整型变量的指针B) 是一个指针数组名C) 是一个指针,它指向一个含有四个整型元素的一维数组D) 定义不合法36.以下正确的定义和赋值语句是___________。
A) int b[3][5], (*p)[5], (*q)[5]; p=b; q=b;B) float b[3][5], (*p)[3]; p[0]=b[0]; p[2]=*b+4;C) double b[3][5], s[5][3], *q; q=b; s=q;D) int b[10], *q; char *s; q=b; s=b;37.若要对a进行合理的自增运算,则a应具有_______________说明。
A) int a[3][2]; B) char *a[]={"12","ab"}; C) char (*a)[3]; D) int b[10], *a=b;38.下面程序运行时从键盘上输入:1 2 3回车,其输出结果是___________。
#include <stdio.h>void main(){int a[3][2]={0}, (*ptr)[2], i, j;for(i=0; i<2; i++) {ptr=a+i; scanf("%d",ptr); ptr++; }for(i=0; i<3; i++)for(j=0; j<2; j++) printf("%d",a[i][j]);}A) 编译错误信息B) 6102000 C) 123000 D) 10203039.若有定义int x[4][3]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int (*p)[3]=x;则能够正确表示数组元素x[1][2]的表达式是_______________。