C语言 百文网手机站

C语言函数参数传递问题

时间:2023-03-22 08:14:12 方宇 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语言函数调用与参数传递10-10

C语言函数参数传递规律10-02

C语言main函数的参数09-03

C语言的可变参数问题10-07

C语言中编写可变参数函数09-05

关于浅谈C语言函数调用参数压栈的相关问题11-20

C语言函数的参数和返回值11-16

C语言中函数之间地址传递方式09-27

C语言中实现参数个数可变函数09-15