C++中函数参数为指针、数组类型时的教学实践
2019-03-07韩祥波
韩祥波
摘要:探讨了数组、指针在函数参数传递中的应用等教学案例,讨论了主调函数和被调函数数据传递的各种情形,分析了函数形参为指针、数组等形式时对应的具体情形。多次教学实践证明,学生编程更活跃,实现了对该知识点的融会贯通。
关键词:C++;数组;指针;参数传递:被调函数;教学实践
中图分类号:G642 文献标识码:A
文章编号:1009-3044(2019)36-0092-01
1概述
在C++的学习中数组、指针、函数三者作为几个核心要点内容多、难度大、综合使用时往往顾此失彼,丢分严重。下面我们通过函数的形参、实参使用指针和数组对此综合运用,达到深入理解的、融会贯通目的。在代码中int f'(int x){ cout《”x=”<
函数的参数传递有值传递和引用传递两种。前者是单向传递,若想通过函数处理实现对形参做的更改在函数调用完毕后对实参有效,需要使用引用传递。下面我们通过几个教学实践的案例来说明实参和形参的几种复杂对应情况。
2教学实践
2.1形参实参都用数组名
#include
void fun(int a[10])
f for(inti=O;1<=9;1++)
a[i]=a[i]*1 0;}
main(){ int b[10]; for(int i-0;i<=9;i++){I)[i]=i; }
fun(b); for(i=O;k=9;1++)(coutq”1)[”<
“fun(int a[10])”声明了形参数组的元素数为10,但实际上该数值是无用的,代码可以改为”fun(int a[])”。这是由于编译程序对形参数组的长度不做检查,而是负责把实参数组的首地址传给形参数组。但在使用中常加入第二个实参来解决实际用到数组元素个数的问题:如”fun(int a[],int x)”,x很好解决了需要的元素个数。实参中”fun(b)”不是把数组”l,”的值传递给形参”a[10])”,而是把实参数组的起始地址传递给形参数组,这样数组“b”,和“a”就共用同一段内存单元。形参数组中各元素的值在开辟的被调函数栈区中被改写,故实参数组元素的值随之变化。
2.2实参用数组名,形参用指针变量
#include
void fun(int 4 p)( for(int i_0;i<9;i++)4(p“)=+(p“)4 10;)
main0( int b[101; for(inti=O;1<9;1++) })[i]=i;
fun(b); for(i=O;i<9;1++) cout<<”I)[”<
本例中形参(int*p)为指针,通过指针偏移来遍历元索实现改值目的,但实参fun()为数组名,此时实参数组的10个元素的数值通过b这个常指针实现了从数组到指针的参数有效传递。即指针p得到了b的值,而b的值即数组首元素b[l]的地址。这个赋值是常指针给指针的赋值,是合理的,但指针对常指针赋值则无效。
2.3形参实参都用指针变量
#include
void fun(int*p)( for(int i_0;i<9;i++) *(p+i)=*(p+i)*10;}
main0( int b[10]; for(int i=O;1<9;i++)(b[i]=i;)
int*q=b; fun(q); for(i=0; 1<9; 1++)(cout”b[”<
本例中形参仍为指针,但实参改为了更常用的普通指针模式。通过int* q=b;实现了数组起始地址到普通指针的赋值,从而为实参到形参的指针对指针的传递做好了准备。两个指针同是指向同一段内存单元,使得函数栈区内部的指针内容的变化得以保存,达到了引用传递的目的。
2.4实参为指针变量,形参为数组名
#im:lude
void fun(int a[10l)f for(int l=0;i<9;i++)a[i]=a[i]*10;}
main(){int b[lO].for(int i=0; k9;i++)( t)[i]=i;}
int*q=b; fun(q);
for(i=0; 1<9;i++){cout《”b[”<
本例中形参为数组,但在主函数中通过”int* q=b;
fun(q);”语句把数组起始地址赋值给普通指针并作为实参传递给形参,虽然形参形式上是数组但本质还是指针类型,需要一个地址值与之对应,而实参q作为数组b的起始地址传递给形参”(int a[10])”自然是形式到内容完全一致的。
3结论
在函数调用中,实参到形参的传递涉及了指针、数组等各种复杂情况,使用时可以选用值传递或引用传递。若想保存对形参对应内容所做的修改则使用后者,此时形参和实参都可用指针或数组的形式,只要本质一致,则传递容易完成,如数组到数组、数组到指针、指针到指针、指针到数组的几种实参到形参的传递都给出了验证过的实例。
参考文献:
[1]刘吴,方欢,袁水莲.浅析C++中获取数组长度的若干方法[J].电脑知识与技术,2018(19).
[2] Bjarne Stroustrup.C++程序设计语言:特别版[M].裘宗燕,译.北京:机械工业出版社,2 010.
[3]罗宪,王家伟,周建丽.“高级语言程序设计”“面向对象程序设计”精品课程教学改革与实践[J].重庆交通大学学报:社会科学版,2009,9(1).
[4]王世同,李强.VisualC++6.0编程基础[M].北京:清华大学出版社,2000.
[5]錢能.C++程序设计教程[M].北京:清华大学出版社,1999.
[6] Lippman S B,Barhara E.Moo.C++ Primer中文版[M].李师贤,译.4版.北京:人民邮电出版社,2006.
[7]陈维兴,林小茶.C++面向对象程序设计教程[M].北京:清华大学出版社,2000.
[8]罗宪,王家伟,周建丽.“高级语言程序设计”“面向对象程序设计”精品课程教学改革与实践[J].重庆交通大学学报:社会科学版,2009,9(1).
[9]陈丛.高级语言程序设计教学方法探讨[J].电脑知识与技术,2012(34).
【通联编辑:王力】
收稿日期:2019-09-23
作者简介:韩详波(1975-),男,山东淄博人,讲师,硕士,研究方向为计算机软件与理论。