C语言函数分类自定义参数及调用方法是什么

技术C语言函数分类自定义参数及调用方法是什么本篇内容主要讲解“C语言函数分类自定义参数及调用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言函数分类自定义参数及

本文主要讲解“C语言函数分类的自定义参数和调用方法有哪些”。感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖学习一下“C语言函数分类的自定义参数和调用方法有哪些”!

1. 函数是什么?

说到函数,我们首先想到的肯定是数学中的函数,那么C语言中的函数到底是什么呢?接下来我们来看看吧!

维基百科中函数的定义:子程序

在计算机科学中,子程序(英语:子例程、过程、函数、例程、方法、子程序、可调用单元)是由一个或多个语句块组成的大型程序中的一部分代码。它负责完成特定的任务,与其他代码相比,相对独立。通常,有输入参数和返回值,它们提供了过程的封装和细节的隐藏。这些代码通常被集成到软件库中。

00-1010

2.C语言中函数的分类

2.1库函数

1.我们知道在学习C编程的时候,我们总是想知道一个代码写完之后的结果,我们想把结果打印在我们的屏幕上。这时,我们会频繁使用一个功能:在屏幕上以一定的格式打印信息(printf)。

2.在编程过程中,我们会经常做一些字符串复制(strcpy)。

3.在编程中,我们也计算,并且总是计算n的幂等于k(幂)。

像我们上面描述的基本功能一样,它们不是业务代码。每个程序员都可以在开发过程中使用它。为了支持可移植性,提高程序效率,C语言基础库提供了一系列类似的库函数,方便程序员开发软件。

2.1.1 为什么要有库函数

那么什么是库函数呢?举个简单的例子,库函数就是C语言本身给我们定义的函数。作为程序员,我们可以直接使用它们,比如printf()和scanf()。

注意:库函数的使用必须包含头文件,比如我们在使用printf()和scanf()的时候,要参考stdio.h头文件,也就是我们通常写的# includesstdio.h。

2.1.2什么是库函数

很多朋友都很困惑,那么主要功能是什么呢?为什么主函数被称为主函数?我们必须使用main()函数吗?接下来,让我们摆脱这个疑问!

首先,我们得出一个结论。在C语言中,main默认是main函数的名称,但main函数的名称不一定是main()。其实我们可以自己设置主函数的名字。C语言中,提供#pragma comment()由我们自己设置主函数的名称,感兴趣的小伙伴可以自行尝试。在这个地方,像优优一样,告诉大家作为程序入口的主函数的名字不一定是main()。至于为什么把main函数叫做main()函数,那是C语言的默认。如果坚持强行解释一波,英语意识的main()就是主要意思。

2.1.3 主函数只能是main()吗

IO功能

字符串操作函数

字符操作功能

记忆操作功能

时间/日期功能

数学函数

其他库函数

这个地方就不展开了,以后用的时候再详细解释。

2.1.4常见的库函数

2.2 自定义函数

用户自定义函数是程序员自己先为特定函数定义的函数!例如,如果我们想添加两个数字,我们定义的add()函数属于自定义函数。

00-1010自定义函数和库函数一样,有函数名、返回值类型和函数参数。

但不同的是,这些都是我们自己设计的。这给了程序员很大的发挥空间。

2.2.1自定义函数是什么

ret_typefun_name(para1,*)

{

声明;//语句项

}

Ret_type返回类型

Fun_name函数名

Para1函数参数

2.2.2为什么要有自定义函数

(1)写一个函数求两个整数的最大值。

# includestdio.h

//get_max函数的设计

intget_max(intx,inty)

{

返回(xy)?(x):(y);

}

intmain()

{

intnum1=10

intnum2=20

intmax=get_max(nu

m1, num2);
printf("max = %d\n", max);
return 0;
}

这个地方给大家解释一下三目运算符,即上面的(x>y)?(x):(y),这个地方表示的是,如果x>y成立,就返回x的值,反之就返回y的值,这样就达到了求最大值的目的!

(2)写一个函数求两个数的和

#include <stdio.h>
//get_add函数的设计
int get_add(int x, int y)
{
	return (x + y);
}
int main()
{
	int num1 = 10;
	int num2 = 20;
	int sum = get_add(num1, num2);
	printf("sum = %d\n", sum);
	return 0;
}

3. 函数的参数

3.1 实际参数(实参)

真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。

注意:为什么可以是函数呢?因为有的函数是由返回值的,所以自然也就能充当实参。

无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形 参。

3.2  形式参数(形参)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单 元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

为什么这样说呢?接下来给大家举个例子吧!

例如我们要交换两个变量的值:

#include <stdio.h>
void swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}
int main()
{
	int num1 = 10;
	int num2 = 20;
	swap(num1, num2);
	printf("num1 = %d\nnum2 = %d", num1,num2);
	return 0;
}

下面是代码的运行结果:

C语言函数分类自定义参数及调用方法是什么

很明显,并没有达成交换的目的,这就证明了:形式参数当函数调用完成之后就自动销毁了,即我们把num1和num2传给x和y之后,虽然我们在函数例将x和y交换了,但是由于x和y在swap函数调用完成后就销毁了,即并没有真正实现num1和num2的交换。

所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。

4. 函数的调用

4.1 传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。我们上述的交换的例子就是传值调用,即并不能真正达成交换两个变量的值的目的!

4.2  传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。

这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。

同样,我们就以前面的交换两个变量的值的例子来给大家进行举例!

#include <stdio.h>
void swap(int *x, int *y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
}
int main()
{
	int num1 = 10;
	int num2 = 20;
	swap(&num1, &num2);
	printf("num1 = %d\nnum2 = %d", num1,num2);
	return 0;
}

这个地方为什么会发生这种情况呢?等后期我们学到指针的那一节的时候将会具体讲解!

4.3 练习

4.3.1. 写一个函数判断一年是不是闰年。
#include<stdio.h>
int is_leap_year(int year)
{
	if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	int year = 0;
	int flag = 0;
	scanf("%d", &year);
	flag=is_leap_year(year);
	if (1 == flag)
	{
		printf("是闰年!");
	}
	else
	{
		printf("不是闰年!");
	}
	return 0;
}
4.3.2.写一个函数可以判断一个数是不是素数。
#include<stdio.h>
#include<math.h>
int is_prime_num(int n)
{
	int flag = 0;
	int i = 0;
	for (i = 2; i <= sqrt(n); i++)
	{
		if (n % i == 0)
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	int i = 0;
	for (i = 100; i < 200; i++)
	{
		int flag = 0;
		flag=is_prime_num(i);
		if (1 == flag)
		{
			printf("%d ", i);
		}
		else
			continue;
		
	}
	return 0;
}
4.3.3  写一个函数,实现一个整形有序数组的二分查找。
#include<stdio.h>
int find_num(int arr[], int size,int k)
{
	int left = 0;
	int right = 0;
	right = size - 1;
	int mid = 0;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	if (left > right)
	{
		return -1;
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int size = 0;
	size = sizeof(arr) / sizeof(arr[0]);
	int ret = 0;
	ret = find_num(arr, size,k);
	if (-1 == ret)
	{
		printf("没有找到!");
	}
	else
	{
		printf("找到了!下标为%d", ret);
	}
	return 0;
}

到此,相信大家对“C语言函数分类自定义参数及调用方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/115591.html

(0)

相关推荐

  • Redis数据结构中的String类型有哪些

    技术Redis数据结构中的String类型有哪些这篇文章主要介绍“Redis数据结构中的String类型有哪些”,在日常操作中,相信很多人在Redis数据结构中的String类型有哪些问题上存在疑惑,小编查阅了各式资料,

    攻略 2021年12月10日
  • 如何安装系统监控工具glances

    技术如何安装系统监控工具glances本篇文章为大家展示了如何安装系统监控工具glances,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。作为运维不仅要时时监控系统,还需要优雅的

    攻略 2021年12月9日
  • 如何进行OpenNI-Linux-Arm64-2.3.0.66安装与调试

    技术如何进行OpenNI-Linux-Arm64-2.3.0.66安装与调试如何进行OpenNI-Linux-Arm64-2.3.0.66安装与调试,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细

    攻略 2021年10月22日
  • c++实现打印结构体所有变量

    技术c++实现打印结构体所有变量 c++实现打印结构体所有变量说明
    c++没有静态反射机制,这里采用暴力解析头文件,并生成代码的形式
    有struct定义解析结构体
    /*
    ---- From XDU's

    礼包 2021年10月19日
  • APK反编译怎么实现源码阅读

    技术APK反编译怎么实现源码阅读APK反编译怎么实现源码阅读,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1什么是反编译?我们编写源程序经过编译变成可执行文

    攻略 2021年11月16日
  • 关于C++的坑有哪些

    技术关于C++的坑有哪些这篇文章主要讲解了“关于C++的坑有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“关于C++的坑有哪些”吧!1. string的字符串拼接,导

    攻略 2021年10月25日