C语言函数参数传递问题

C语言函数参数传递问题

在一些C语言教材和参考资料中,常常把函数参数传递分为“数值传递”和“地址传递”两种方式,这种概念模糊的分类方法给初学者的理解造成一定程度的困难。下面就由为大家介绍一下C语言函数参数传递问题,欢迎大家阅读!

1、概述

函数是C语言程序的基本构成模块,通过使用函数,不仅可以省去重复代码的编写,还可以使程序更加模块化,从而有利于程序的阅读、修改和完善。对于C语言的初学者来说,准确理解函数参数的传递方式是难点之一。一些C语言程序设计教材[1][2]中把函数间的参数传递分为“数值传递”和“地址传递”两种方式,这种分类很容易使初学者混淆概念,更不能抓住参数传递的本质。

2、传递方式和数据类型

“值传递”是函数参数的唯一传递方式。函数的参数分为实际参数(简称实参)和形式参数(简称形参),在定义函数时使用的参数叫形参,在调用函数时使用的参数叫实参。实参可以是常量、变量或表达式,但要求它们有确定的值。实参与形参的结合只有一种方式,即“值传递”,把实参的值赋给形参变量。“值传递”具有单向性,只能把实参传给形参,而不能由形参回传给实参。

不同数据类型的函数参数对主调函数中变量的作用有所不同。函数参数可取的数据类型为基本类型、构造类型、指针类型或空类型,如***所示。空类型表示该函数为无参函数,在此不作介绍。其余数据类型又可分为三类:普通类型,包括基本类型、结构体类型和共用体类型;指针类型;数组类型。函数参数为普通类型时,对函数的调用不用影响到主调函数中变量的值;函数参数为指针类型或数组类型时,对函数的调用可以修改主调函数中有关变量的值。

3、普通类型变量作为函数参数

普通变量作为函数参数时,对形参的修改不会影响到实参。如下例所示,通过“值传递”,形参x保存了实参a的值,形参y保存了实参b的值,因为形参和实参是相互***的不同变量,所以在swap函数中对形参x和y进行的交换不会反映到实参a和b中。

#include

void swap(int x, int y)

{

int temp;

temp=x; x=y; y=temp;

}

void main()

{

int a, b;

scanf("%d%d", &a, &b);

swap(a, b);

printf("%d %d ", a, b);

}

输入:1 2

输出:1 2

4、指针作为函数参数

变量的指针就是变量的地址,存放变量地址的变量叫指针变量,定义指针变量的一般形式为:

基类型*指针变量名;

通过指针变量访问其所指向的变量的方式称为间接访问方式。如下例所示。

int age;

a=10; //直接访问方式

int* p=&a;

*p=11; //间接访问方式

指针类型作为函数参数时,参数传递方式仍然是“值传递”,即把实参的值传递给形参。不同的是参数为指针变量,可以通过形参的间接访问方式来读取或修改主调函数中有关变量的值。

如下例所示,通过“值传递”,形参x保存了变量a的地址,形参y保存了变量b的地址,即x指向变量a,y指向变量b,在swap函数中通过间接访问方式交换了变量a和b的值。

#include

void swap(int* x, int* y)

{

int temp;

temp=*x; *x=*y; *y=temp;

}

void main()

{

int a, b;

scanf("%d%d", &a, &b);

swap(&a, &b);

printf("%d %d ", a, b);

}

输入:1 2

输出:2 1

5、数组名作为函数参数

数组元素和数组名也可以作为函数参数,数组元素作为函数参数与普通变量用法相同,数组名作为函数参数与指针变量相同。

用数组名作函数形参时,指定数组大小是不起任何作用的。因为C语言编译对形参数组大小不做检查,只是将实参数组的首地址传递给形参数组。实参数组名即是实参数组的首地址,相当于指针常量;形参数组名相当于指针变量。实际上,C编译都是将形参数组名作为指针变量来处理的[3]。所以,数组名作为函数参数可以按指针作为函数参数来理解。

如下例所示,数组名array代表数组array的首地址,通过“值传递”,形参数组名a,也可以理解为形参指针变量a,保存了数组array的首地址,因此,在swap函数中对形参数组a的操作即是对实参数组array的操作。

#include

void swap(int a[])

{

int temp;

temp=a[0]; a[0]=a[1]; a[1]=temp;

}

void main()

{

int array[2];

scanf("%d%d", &array[0], &array[1]);

swap(array);

printf("%d %d ", array[0], array[1]);

}

输入:1 2

输出:2 1

6、结论

综上所述,C语言函数参数问题主要涉及两个概念:传递方式和数据类型。实参与形参的传递方式只有一种,即“值传递”。参数的数据类型可以为普通类型、指针类型和数组类型,数组类型实际上是按指针类型来处理的,所以,主要是指针类型与非指针类型的区别。对初学者来说,问题的难点在于数据类型的不同而非传递方式,即指针类型变量与非指针类型变量的区别。

C语言函数参数的含义

函数(Function)是一段可以重复使用的代码,这是从整体上对函数的认识。

C语言本身带了很多库函数,并分门别类地放在了不同的头文件中,使用时只要引入对应的头文件即可。

除了C语言自带的函数,我们也可以编写自己的函数,称为自定义函数(User-Defined Function)。自定义函数和库函数没有本质的区别,表现形式和使用方法一样,只是开发者不同而已。

这一章我们就来讲解如何编写和使用自己的函数。

参数

函数的一个明显特征就是使用时带括号( ),必要的话,括号中还要包含数据或变量,称为参数(Parameter)。参数是函数需要处理的数据,例如:

strlen(str1)用来计算字符串的长度,str1就是参数。

puts("C语言中文网")用来输出字符串,"C语言中文网"就是参数。

返回值

既然函数可以处理数据,那就有必要将处理结果告诉我们,所以很多函数都有返回值(Return Value)。所谓返回值,就是函数的执行结果。例如:

char str1[] = "C Language";

int len = strlen(str1);

strlen() 的处理结果是字符串 str1 的长度,是一个整数,我们通过 len 变量来接收。

函数返回值有固定的数据类型(int、char、float等),用来接收返回值的变量类型要一致。

C语言函数参数传递问题

转载请注明出处我优求知网 » C语言函数参数传递问题

学习

好听的微信网名

阅读(35)

本文为您介绍好听的微信网名,内容包括好听的微信网名伤心,好听的微信网名励志,好听的微信网名带符号。好听的微信网名11、一抹苦笑

学习

玉镯的鉴别方法

阅读(31)

本文为您介绍玉镯的鉴别方法,内容包括玉镯的鉴别方法图解大全,玉镯的鉴别方法最简单,玉最好鉴别方法。任何玉镯都是由一个圆形或接近于圆形的圈子组成,有些为标准的圆形,有些为椭圆圈(蛋圆形),它们的内圈口和外圈相一致,呈同心状。中年妇女都

学习

饮食礼仪的概念

阅读(54)

本文为您介绍饮食礼仪的概念,内容包括饮食礼仪的概念是什么,饮食礼仪的概念实质及作用,饮食礼仪包含的内容。我们都知道,中国拥有五千年的文明,也是著名的礼仪之邦,下面,整理了一些饮食礼仪的概念,向大家推荐。

学习

工程训练实习报告

阅读(33)

本文为您介绍工程训练实习报告,内容包括工程训练实习报告2000字,工程训练实习报告心得体会。工程训练实习报告在现实生活中,报告与我们愈发关系密切,报告具有成文事后性的特点。你所见过的报告是什么样的呢?下面是整理的工程训练实习报告,希

学习

小学新教师述职报告范文(精选)

阅读(36)

本文为您介绍小学新教师述职报告范文(精选),内容包括小学新教师述职报告5分钟演讲,小学新教师个人述职报告简短精辟。小学新教师述职报告范文一、述职报告的功用1、上级主管部门考核、评估、任免、使用干部的依据;2、述职者本人总结经验、

学习

新教师述职报告(精选)

阅读(28)

本文为您介绍新教师述职报告(精选),内容包括新教师述职报告15篇,新教师述职发言。新教师述职报告一、述职报告的历史发展我国进行干部体制改革后,实行了岗位责任制和干部聘任制。受聘的干部或由选举出任的干部,在一定时期内,要向有关部门报告

学习

上课吃瓜子检讨书(精选)

阅读(28)

本文为您介绍上课吃瓜子检讨书(精选),内容包括上课吃瓜子检讨书1000字,在学校吃瓜子检讨书300字,在学校吃瓜子写检讨书400字。在学习、工作或生活中出现了失误后,为了防止此类事情再度出现,往往被要求写检讨书来自我反思,写检讨书尽量要写得

学习

五年级语文工作计划集锦

阅读(27)

本文为您介绍五年级语文工作计划集锦,内容包括五年级下学期语文工作计划,小学五年级语文工作计划精选5篇。五年级语文工作计划集锦6篇人生天地之间,若白驹过隙,忽然而已,我们又将迎来新的喜悦、新的收获,是时候认真思考计划该如何写了。那么

学习

关于乡镇年度工作计划范文集锦七篇

阅读(38)

本文为您介绍关于乡镇年度工作计划范文集锦七篇,内容包括乡镇年度工作计划集锦八篇,乡镇干部2022年度个人工作计划。关于乡镇年度工作计划范文集锦七篇时间过得可真快,从来都不等人,我们的工作又将在忙碌中充实着,在喜悦中收获着,是时候抽出

学习

如何挑选干海带

阅读(34)

本文为您介绍如何挑选干海带,内容包括如何挑选干海带结,如何挑选干海带的好坏,如何挑选干海带怎样泡发才能软烂。海带的营养价值很高,富含蛋白质、脂肪、碳水化合物、膳食纤维、钙、磷、铁、胡萝卜素、维生素B1、维生素B2、烟酸以及碘等

学习

如何挑选精油

阅读(42)

本文为您介绍如何挑选精油,内容包括如何挑选精油按摩身体的产品,如何挑选精油皂,如何挑选合适的精油。化学成分及其作用机转的基本知识,是正确挑选精油及基底油的必备条件。植物学方面的认知,能帮助我们从各种精油中过滤出最佳候选者,避免

学习

教学设计学习心得

阅读(26)

教学设计学习心得15篇作为一位兢兢业业的人民教师,总归要编写教学设计,教学设计是对学业业绩问题的解决措施进行策划的过程。我们该怎么去写教学设计呢?下面是为大家收集的教学设计学习心得,仅供参考,大家一起来看看吧。教学设计学习心得1在

学习

【推荐】文艺悲伤签名集锦75条

阅读(36)

本文为您介绍【推荐】文艺悲伤签名集锦75条,内容包括悲伤的网名昵称和签名,唯美悲伤签名集锦88句。【推荐】文艺悲伤签名集锦75条原来有一种难过,只能让人默默流泪,却无法放声大哭。下面是给各位读者分享的文艺悲伤签名75条,感兴趣的一起

学习

关于小学体育教学心得体会

阅读(28)

本文为您介绍关于小学体育教学心得体会,内容包括关于小学体育教学心得,小学体育培训心得体会。关于小学体育教学心得体会某些事情让我们心里有了一些心得后,可以将其记录在心得体会中,这样能够给人努力向前的动力。那么问题来了,应该如何写

学习

数学函数知识点

阅读(68)

本文为您介绍数学函数知识点,内容包括数学函数知识点整理,数学函数知识点初中,数学函数知识点归纳高中。漫长的学习生涯中,大家都背过不少知识点,肯定对知识点非常熟悉吧!知识点是指某个模块知识的重点、核心内容、关键部分。掌握知识点有

学习

extern在函数声明中的意思

阅读(78)

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。以下是整理的extern在函数声明中的意思,希望对大家有所帮助。

学习

传递爱心演讲稿

阅读(34)

本文为您介绍传递爱心演讲稿,内容包括关于传递爱心演讲稿,爱心传递演讲稿800字。传递爱心演讲稿演讲稿是一种实用性比较强的文稿,是为演讲准备的书面材料。在充满活力,日益开放的今天,演讲稿与我们的生活息息相关,大家知道演讲稿的格式吗?下

学习

《二次函数与一元二次方程》教学反思

阅读(34)

本文为您介绍《二次函数与一元二次方程》教学反思,内容包括二次函数与实际问题教学反思,二元一次方程与一次函数教学反思。《二次函数与一元二次方程》教学反思身为一名优秀的人民教师,我们要有一流的课堂教学能力,对教学中的新发现可以写

学习

热的传递教学反思

阅读(83)

本文为您介绍热的传递教学反思,内容包括热的传递教学反思8篇,热在水中的传递教学反思。热的传递教学反思作为一位优秀的老师,我们的任务之一就是教学,通过教学反思可以有效提升自己的课堂经验,我们该怎么去写教学反思呢?以下是为大家收集的

学习

一次函数与二元一次方程组教学反思(通用)

阅读(39)

本文为您介绍一次函数与二元一次方程组教学反思(通用),内容包括代入消元法解二元一次方程反思,代入法解二元一次方程组教学反思,一次函数与二元一次方程教案详案。随着社会不断地进步,教学是重要的任务之一,反思指回头、反过来思考的意思。

学习

单反逆光拍摄参数调节

阅读(23)

本文为您介绍单反逆光拍摄参数调节,内容包括逆光拍太阳参数设置,单反逆光如何调整拍摄参数,手机拍逆光参数设置。逆光是指从被摄体背后照射过来的光线。单反逆光的参数应该怎样调节呢?下面是精心整理的单反逆光拍摄参数调节,欢迎阅读,希望

学习

函数的最值教案设计

阅读(46)

本文为您介绍函数的最值教案设计,内容包括数学函数的最值优秀教案,对勾函数求最值方法,二次函数的最值问题。作为一名优秀的教育工作者,时常要开展教案准备工作,编写教案有利于我们弄通教材内容,进而选择科学、恰当的教学方法。教案应该怎