首页 > 其他分享 >函数和参数

函数和参数

时间:2024-10-08 20:50:28浏览次数:3  
标签:函数 形参 int 参数 实参 库函数 自定义

1.简介

        函数,相信大家在数学领域中早已或多或少地对函数有了一些了解和学习,与数学领域不同,在c语言中将函数定义为完成特定任务的独立程序代码单元。

2.函数的作用 

        为什么要使用函数呢?首先,使用函数可以省去编写重复代码的苦差,如果程序要多次完成某项任务,那么只需要编写一个合适的函数。其次,使用函数能够提高代码的可读性,更方便后期的修改和完善。

3.两种函数类型

        在c语言中,一共有两种函数类型,一种是c语言自带的库函数,另一种是需要程序员自己编写的叫自定义函数。

库函数

        下面我们先来认识一下c语言的库函数的使用,使用c库函数需要包含相应的头文件。以下是几种常用的头文件和它们的功能:

1、<stdio.h>:提供输入和输出功能的函数,例如 printf()scanf()fopen()fclose() 等。

2、 <stdlib.h>:提供通用工具函数,如动态内存分配malloc()free())、程序退出(exit())、随机数生成(rand()srand())等。

3. <string.h>:提供字符串处理函数,如字符串复制(strcpy())、连接(strcat())、比较(strcmp())、长度计算(strlen())等。

4、<math.h>:提供数学运算函数,如平方根(sqrt())、幂运算(pow())、三角函数(sin()cos()tan())等。

5、<ctype.h>:提供字符处理函数,如字符分类(isalpha()isdigit()islower())、字符转换(toupper()tolower())等。

6、<time.h>:提供时间和日期处理的函数,如获取当前时间(time()localtime())、时间差计算(difftime())等。

         如果大家对c库函数有兴趣,也可以跳转到下面这几个网站进行学习查询,这里就不再做过多赘述:

http://www.cppprefence.com(可以切换中文用起来比较方便)

https://cplusplus.com/

        还有另一种方法不需要网络也可以使用,但是需要下载MSDN,下面是另一位博主的下载教程的博客(附带使用说明):

https://blog.csdn.net/why1472587/article/details/124825657

自定义函数

        自定义函数,顾名思义:就是由程序员自己定义的函数,自定义函数相比库函数更加灵活多变,能解决的问题也自然更多。下面是一个自定义函数的结构表示:

        上述的自定义函数能够完成两个数大小的比较,具体代码如下:

#include <stdio.h>

int MAX(int x, int y) {
	return x > y ? x : y;
}
int main()
{
	int m = 10;
	int n = 20;
	int max = MAX(n, m);
	printf("%d", max);
	return 0;
}

4.函数的实参与形参

        函数的内部有实际参数(实参)和形式参数(形参)两种参数,用简单的话描述:调用函数时的参数为实参;函数中定义的参数为形参。

        下面我们通过两串代码来剖析实参和形参(代码功能:交换两个数的位置)

注意:这是一段错误的代码,它无法交换两个数。

#include <stdio.h>
void Change(int m,int n) //行参
{
	int tmp = 0;
	tmp = m;
	m = n;
	n = tmp;
}
int main()
{

	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:%d %d\n", a, b);
	Change(a, b);		//实参,传值调用									
	printf("交换后:%d %d\n", a, b);
	return 0;
}

        

       可以看到这串代码并没有完成任务,下面我们通过监视来看看程序中错误的原因:

        可以看到,程序将实参a、b的值传递给了形参m、n,但他们的存储地址并不相同,虽然在函数中,m、n的值做了交换(在函数调用后m、n销毁),并没有影响到实参a、b。

        由此可知,实参在调用时必须要有确定值,它可以是值、表达式、变量、函数;而形参在函数调用时才实例化(分配内存单元),在函数调用完后销毁,它只在函数中有效。

        那么我们应该如何让a、b的值交换呢?别急,让我们继续往下看!下面我们将讲述函数的另一种调用方式,他就能够使a和b的值调换。

5.函数的调用方式

        刚才的代码我们使用的调用函数为传值调用,由刚才的调试可知:它使实参和形参分别占有不同的内存块,对形参的修改并不能影响实参。

        下面我们介绍另一种函数调用方式,传址调用:它将函数外部创建变量的内存地址传递给函数参数,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部直接操作函数外部。使用它就可以交换刚才a和b的值。

正确代码:

#include <stdio.h>
void Swap(int *pa, int *pb) //行参
{
	int tmp = 0;
	tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}
int main()
{

	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:%d %d\n", a, b);
	Swap(&a, &b);//实参,传址调用									
	printf("交换后:%d %d\n", a, b);
	return 0;
}

        看到这里,希望大家能给博主点一个免费的三连,博主在此跪谢大家了!

标签:函数,形参,int,参数,实参,库函数,自定义
From: https://blog.csdn.net/CxK6666667/article/details/142748804

相关文章

  • 自定义DFS,DFT,DTFT函数并比较关系
    一、DFS(离散傅里叶级数)functiony=DFS(x,L)N=length(x);xi=[x;zeros(L-N,1)]; y=zeros(1,L);fork=1:Lsum=0; forn=1:Lsum=sum+xi(n)*exp(-2j*pi*k*n/L); end y(k)=sum; end end 二、DFT(离散傅里叶变换) functiony=DFT(x,L)N......
  • JavaScript数组合并方法(concat()函数)
    在JavaScript中,concat方法用于连接两个或多个数组,并返回一个新数组。这不会改变现有的数组,而是返回一个包含了连接元素的新数组。解法1:基本的concat使用方法letarray1=[1,2,3];letarray2=[4,5];letarray3=array1.concat(array2);console.log(array3);//输......
  • 自定义卷积函数并计算窗函数的卷积
    一、自定义卷积functiony=Convu(x,W) Nx=length(x); Nw=length(W); y=zeros(1,Nx+Nw-1); forn=1:Nx+Nw-1 sum=0; startIdx=max(1,n-Nw+1); endIdx=min(n,Nx); fork=1:Nw ifstartIdx+k-1<=endIdx sum=sum+......
  • Scala函数进阶
    (一)函数的字面量用语法1,语法为:(参数列表)=>{方法体}2,函数的字面量作用由于scala的函数字面量没有定义函数名,所以可以通过变量进行调用。另外,也可以通过参数的方式进行调用,关于这种方式的介绍将在scala的函数高阶中进一步说明,这里不在展开叙述。3,scala的函数字面简化第一......
  • C++——有一个Date类,私有成员:月、日、年,公有成员:函数,其作用输出月/日/年,一个构造函数
    没注释的源代码#include<iostream>usingnamespacestd;classDate{private:  intmonth;  intday;  intyear;public:  voiddisplay()  {    cout<<month<<"/"<<day<<"/"<<year<<endl;......
  • C++——有Date类,私有成员:月日年,公有成员:函数,其作用输出月日年。一个构造函数有三个参
    没注释的源代码#include<iostream>usingnamespacestd;classDate{private:  intmonth;  intday;  intyear;public:  voiddisplay()  {    cout<<month<<"/"<<day<<"/"<<year<<endl;......
  • 用函数创建DataFrame:使用字典推导式
    importpandasaspddefmake_df(cols,ind):"""一个简单的DataFrame"""#字典推导式,为每列生成数据data={c:[str(c)+str(i)foriinind]forcincols}#创建并返回DataFramereturnpd.DataFrame(data,ind)#DataFrame示例d......
  • std::bind--改变函数参数的局限
    std::bind是C++标准库中的一个工具,用于将函数对象与部分参数绑定在一起,生成一个新的可调用对象。这使得函数的参数可以被部分或全部提前指定,从而得到一个参数更少甚至无参数的函数对象。在某些情况下,它可以用来延迟执行函数、简化函数调用,或在需要无参函数对象的场景中使用(如线......
  • 讨论jiffies回转的time_after比较函数
    本文讨论jiffies回转的比较函数:#definetime_after(a,b)\((long)(b)-(long)(a)<0)写了个例子如下:#include<stdio.h>#include<stdint.h>#definetime_after(a,b)\((long)(b)-(long)(a)<0)intmain(){unsignedlongla......
  • C# WebService返回参数为DataTable报错“XML文档有错误”
    该问题由于DataTable列存在自定义类型。解决该报错需要以下几步:1、自定义类型增加xml序列化2、由于C#从XML反序列化DataSet或DataTable时的默认限制,所以需要先把调用方的项目开放限制,如果是.netframework项目,需要在app.config中添加<configuration><runtime>......