【C语言】函数及相关知识点

hello,很高兴今天发表这篇博客,我是一名双非一本计科专业的学生,目前大一马上升大二,这算是我第一篇耗费大量时间写的博客,希望以后的日子里我也能坚持输出对大家有用的博客,有志同道合的小伙伴可以互关陪伴彼此成长。

目录

1. 函数是什么

2. C语言中函数的分类

2.1 库函数

2.2自定义函数

3.函数的参数

3.1 实际参数(实参)

3.2 形式参数(形参)

4.函数的调用:

4.1 传值调用

4.2 传址调用

5. 函数的嵌套调用和链式访问

5.1 嵌套调用

5.2 链式访问

6. 函数的声明和定义

6.1 函数声明

6.2 函数的定义


1. 函数是什么

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

  在计算机科学中,子程序是一个大型程序中的某部分代码,由一个或多个语句块组成,是负责完  成某项特定任务并具有相对独立性的代码。

  一般会有输入参数并有返回值,提供对过程的封装。这些代码通常被集成为软件库。

2. C语言中函数的分类

2.1 库函数

库函数的由来:程序员在开发过程中普遍用到的某些功能(如打印输出,字符串的拷贝等)被制作为库函数来支持可移植性和提高程序的效率。

怎么学习库函数:www.cplusplus.com (库函数查询网站)

                             http://en.cppreference.com (英文版)

                             http://zh.cppreference.com (中文版)

      在查询网站中了解到某个库函数的功能特点并加以利用,不必强求记忆,常查常新,多加运用,熟能生巧喔!

注意: 使用库函数必须包含#include对应的头文件。

C语言常用的库函数:IO函数、字符串操作函数、字符操作函数、内存操作函数、时间/日期函数、数学函数、其他库函数。

2.2自定义函数

自定义函数比库函数灵活多变得多,你可以自己定义一个函数让它来帮你实现你想实现的功能,很有发挥空间也很有挑战性哦 ~ 让我们来了解一下吧!

函数的组成:

ret_type fun_name(para1, *)
{
      statement;//语句项
}

ret_type //返回类型
fun_name //函数名
para1    //函数参数

如你所见,自定义函数是由函数名、返回值类型和函数参数组成的。(库函数也是由这三部分组成的哦。) 为了更直观的观察函数,我们来举两个例子。

比如,我们现在来设计一个可以找出两个整数中最大值的函数

int get_max(int x, int y) //函数名的选取要和功能相对应,以此来提高代码的规范性
{
   return (x > y) ? (x) : (y); //三目运算符
}

现在,我们再来设计一个可以交换两个整型变量的函数

void Swap(int * px, int * py)
{
    int tmp = 0; //创建一个临时变量
    tmp = *px;
    *px = *py;
    *py = tmp;
}

观察这两个例子,我们可以发现函数名前面的返回值类型的区别。第一个例子中的“int”代表函数有返回值,并且返回值类型是整型,第二个例子中的“void”代表函数无返回值。如果函数的返回值是其他类型就用对应的double ,float即可。

针对第二个例子,函数的初学者或者对函数理解不是很深刻的朋友可能会好奇为什么函数参数要用指针类型传进来,这时候就要求咱们对函数的参数和传递有更深的了解啦,让我们继续看下去吧。

3.函数的参数

函数的参数分为实际参数和形式参数。

3.1 实际参数(实参)

定义:真实传给函数的参数。

形式:常量、变量、表达式、函数等。

注意:无论实参是什么形式,在进行函数调用时都必须有确定的值。

3.2 形式参数(形参)

定义:函数名之后的括号内的变量,因为形参只在函数被调用的过程中才分配内存,所以叫形式参数。

注意:形参在函数调用完成后就自动销毁了,因此形参只在函数中有效。

函数在被调用的时候,形参拥有了自己的空间,同时拥有了和实参一模一样的内容,所以我们可以理解为:形参分配内存后相当于实参的一份临时拷贝。

4.函数的调用:

这里是第二个例子为什么要用指针变量传入的关键嗷,敲黑板,很重要!!!

4.1 传值调用

函数的形参和实参分别占有不同的内存块,所以对形参的修改不会影响实参。

4.2 传址调用

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

它可以让函数和函数外部的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

第二个例子就是运用了传址调用,如果用普通整型变量的话main函数无法输出交换之后的两个变量的预期值。(为了加深理解推荐大家去自己敲敲代码看看二者输出的区别)

5. 函数的嵌套调用和链式访问

函数和函数之间可以根据实际需求进行组合,即互相调用。

5.1 嵌套调用

#include
void first_line()
{
	printf("Hello,wangmumu!");
}
void second_line()
{
	int i;
	for (i = 0; i < 3; i++)
	{
		first_line(); //调用第一个定义的函数
		printf("\n");
	}
}
int main()
{
	second_line();
	return 0;
}

【C语言】函数及相关知识点_第1张图片

 注意:函数可以嵌套调用,但是不能嵌套定义。

5.2 链式访问

定义:把一个函数的返回值作为另外一个函数的参数。

#include
int main()
{
	printf("%d", printf("%d", printf("%d", 43)));//三个printf函数的嵌套调用
    //注意:printf函数的返回值是打印在屏幕上字符的个数
	return 0;
}

【C语言】函数及相关知识点_第2张图片

6. 函数的声明和定义

6.1 函数声明

1. 告诉编译器有一个函数叫什么、参数是什么、返回类型是什么。但是函数声明无法决定此函数是否真正存在。

2. 函数的声明一般出现在函数的使用之前,先声明再使用。

3.函数的声明一般放在头文件中。(头文件是以".h"结尾的文件名,而main()函数所在的文件则是以".c"结尾的,".c"后缀的文件内部,也就是 main函数 内部主要是调用各个功能函数,函数的声明部分一般放在在".h"后缀的头文件中,这样是为了实现C语言的结构化,创建好了头文件,就可以在头文件内部实现各个函数的声明。)这个和多文件编程关联比较大,但是并不难理解,感兴趣的可以去搜集一下相关资料哦,下面这个函数的定义中也提到这一点啦!

6.2 函数的定义

函数的定义是指函数的具体实现,交代函数的功能实现。

test.h中放置函数的声明

int Add(int x, int y);

test.c中放置函数的实现

#include //一定要包含这个头文件呀!
int Add(int x, int y)
{
  return x + y;
}

这种分文件分模块的书写形式很值得我们去学习哦!

到现在我们已经介绍了函数大部分的知识啦,还有更有难度一点的关于函数递归的知识我决定新开一篇来写,期待我们下次见面!

你可能感兴趣的:(c语言,开发语言)