资源描述:
《《C语言程序设计》中的指针形参和函数体中数组实参问题的教学研究.pdf》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、《C语言程序设计》中的指针形参和函数体中数组实参问题的教学研究山东理工大学计算机学院董敬富淄博市劳动局职业技能鉴定中心董京亮摘要:指针是C语言中一个重要的概念,也是C语言中一个重要的特色。正确而灵活地运用指针可以提高程序的运行速度和降低程序的存储空间。在构造链表、树、图等复杂的数据结构,方便地使用字符串、数组,从被调函数得到多个值,甚至可以动态地分配内存等普通程序所不能实现的功能,也可以有效地表示和实现复杂的数据结构。同时指针又是一个十分难以理解的概念,特别是指针形参和数组实参传递参数时,由于分不清参数的性质,错误地使用指针将使
2、程序中隐藏一些不容易发现且难以排除的错误。本文以浅显的论述,讲述指针形参和函数体中数组实参问题,以期达到抛砖引玉的目的。关键词:地址指针函数形式参数实在参数中图分类号:O174文献标识码:A文章编号:一、指针概念的理解计算机的内存是以字节为单位的一片连续的存储空间,为了有效的管理和使用每一个空间,系统给每一个字节进行编号,这个编号就是该字节在内存的地址。指针是一个特殊的变量,它存储的数值恰恰就是内存的这个编号,为了区别存放“编号”变量和“数值”变量,就把“编号”变量形象的称为指针变量。这个问题不难理解,通常我们会讲上午1、2节在
3、9号教学楼211教室上C语言,这里的211就是一个教室的编号而已,我们确实把它作地址用了。在你听到上述表述时,是不是在脑海中在判断哪是9号教学楼,哪个是211教室。这时你的脑海中是否涌现出了一个无形的箭头指向了“9号教学楼211教室”呢?所以说指针是地址的形象化称呼,并非在内存中真正有指针存在。而数值211则可表示重量长度等。intx=1,*p;此时定义了一个变量x,内容为数值1,一个指针变量p,指向不定空间。在执行语句p=&x;后,变量x的地址送p;也就是说p指向了x。二、函数概念的理解函数是模块设计的重要思想,它是把程序中多
4、次用到的程序段取出来给它取上一个名字,在程序中用到该程序段时只要写上它的名字就可以了,这个名字表示“做什么”,至于“怎么做”,则在定义函数时详细说明。函数名是这个程序段的首地址,是一个常量地址(指针常量)。由于函数的多次调用,它对符合量的某一特征的参数都应该能够处理,这样说来它使用的参数就不可能用一个具体的、实在的参数表示,只能用形式上代表着量的某一特征的参数来表示,这种参数就是形式参数。实在参数则是调用函数时所处理的一个具体的,实在的值。也就是说函数的形式参数重点强调的是“形式上代表着量的某一特征的参数”,就像我们平时所说的“
5、C语言老师”,这个“老师”可以是张三也可以是李四,但是张三也好李四也罢,必须符合能教授C语言这一特征。而实在参数则强调的是函数处理时的具体的值。上例所讲中的“C语言老师”,在开始具体讲授C语言课时的哪个老师,是实在参数。简单讲,在定义函数时的参数是形式参数,在调用函数时的参数是实在参数。Intfun(inta,intb)a,b是形式参数,特征是整形数{intc;c=a+b;returnc;}Main(){intx,y,z;Scanf(“%d%d”,&x,&y);z=fun(x,y);x,y是实在参数,通过scanf函数输入的任何
6、整形数都可以printf(“%d”,z);}三、数组概念的理解数组是C语言最简单的一种构造类型,每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元,使用相同的名字不同的下标来引用不同的单元。inta[10];计算机在执行该语句后会分配10个连续空间,这10个空间有一个共同的名字叫a,这个a是数组的首地址,是一个常量地址值。a+1等于&a[1]。若要访问哪一个空间,则分别用a[0],a[1],a[2]…a[9],来表示。二维数组则可以理解为一维数组的每一个元素又是一维数组,intarray[3][4];共有3行
7、,每行有4列的元素组成。在存储时则按行优先或列优先连续存储。至于array+1和&array+1是不同的。array+1是从array算起,按int[4]类型的大小,向前移动一步,此时array+1的值指在array[1]处。而&array+1是从array算起,按int[3][4]类型的大小,向前移动一步(此步很大,整整扩过了二维数组),此时&array+1的值指在二维数组array的界外。因为&array明确指示编译器,要将加一的步长按二维数组计。四、指针与函数的结合函数名实际上也是一种指针,指向函数的入口地址,但它又不同于
8、普通的如int*、double*指针,看下面的例子来理解函数指针的概念:Intfunsub(int,int);Main(){int(*pfun)(intx,inty);Inta,b;Scanf(“%d%d”,&a,&b);Pfun=funsub;(*pfun)(