C的历程------函数(上)

本文介绍了C语言中函数的基本概念,包括函数的定义、分类,如库函数和自定义函数。详细讲解了函数参数的实参与形参,以及两种调用方式——传值调用和传址调用。此外,还探讨了函数的嵌套调用和链式访问,通过示例解释了如何实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀


一、函数定义与分类

1. 函数是什么

数学间我们很容易见到有函数,比如有一次函数,二次函数,反比例函数等等,可是你了解C语言的函数吗?
维基百科对函数的定义:子程序,是一个大型程序中的某部分代码, 由一个或多个语句块组
成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

2.函数的分类

  • 库函数
    库函数的使用不需要专门去记,我们可以通过查找了解它们的使用方式,这里推介一个网站www.cplusplus.com
  • 自定义函数
    如果库函数能干所有事情,那么还要程序员干什么,自定义函数由程序员自主设计,和普通的函数一样有函数名、返回类型、形式参数等。

二、函数的参数

1.实际参数(实参)

真实传给函数的参数,叫实参。实参可以是:常量变量表达式函数等。
在调用函数时,它们都必须有确定的值,以便把这些值传送给形参。

2.形式参数(形参)

形式参数是指函数名后括号中的变量
形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。因此形式参数只在函数中才有效。

三、函数的调用

当我们的函数写好后,我们需要把他们和主函数搭配起来,这样就可以实现函数应该体现出来的效果了,以下介绍的是两种常用的调用方式,传值调用和传址调用

1. 传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。所以,我们在不改变函数实参的时候可以使用传值调用。

示例如下

#include"stdio.h"
int add(a, b)
{
	int sum = 0;
	sum = a + b;
	return sum;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int c = add(a, b);
	printf("%d", c);
	return 0;
}

在程序中,我们只是对a和b进行操作,没有改变a和b的数值属性,在这里我们就可以使用传值调用,再将操作得到的值返回。

2.传址调用

当我们调用函数想要改变实参的值,这是我们应该使用传址调用,因为形参接受实参值时会开辟另外的空间来存放,这时想要通过改变形参来达到改变实参的目的,就不会实现,因为地址不同,所以我们要传地址。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

下面介绍下简单的指针思路

#include"stdio.h"
int main()
{
	int a = 10;
	int* pa = &a;   //pa存了a的地址
	*pa = 20;       //找到a,并对其解引用
	printf("%d", a);
	return 0;
}

我们再将这种思路放到一段程序上,交换两个整型值

void swap(int* pa,int* pb)//返回类型为void表示不返回,此处的int* pa与int* pb表示形式参数和它们的类型
{

	int tmp = *pa; //tmp = a
	*pa = *pb;	   //a = b
	*pb = tmp;     //b = tmp
    //跳出函数时,被销毁的形参只是两个指针变量,此时实参的交换已经完成


}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:a = %d   b = %d\n", a, b);
	swap(&a, &b);
	printf("交换后:a = %d   b = %d\n", a, b);

	return 0;
}

四、函数的嵌套调用和链式访问

1.嵌套调用

函数和函数之间可以相互调用,还记的我们再进入C语言写的第一个代码吗,没错,打印“hello world”

int main()
{
	printf("hello world");//printf()也是一个函数
	return 0;
}

我们的主函数main(),调用了打印函数printf(),这也是函数调用的一种表现形式。

2.链式访问

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

这里卖一个小关子,以下代码输出的是什么

#include<stdio.h>
int main()
{
    printf("%d", printf("%d", printf("%d", 43)));
    return 0;
}

没错,答案是4321
在这里插入图片描述
这里可以先说明下,printf()函数返回的是一个打印字符的个数,在第三层的代码printf("%d",43)打印了43,并且返回打印的字符个数2,所以到了第二层printf("%d",printf("%d",2)),打印了2,并且返回了打印的字符个数1,到了第一层printf("%d",1),最后打印1,程序结束。也就形成了4321的结果。这就是在链式访问里面比较经典的题目啦


总结

本文介绍了C语言函数相关基本定义和相关概念,下文将继续讲解函数相关的知识,如声明和定义,以及递归相关的知识点,还会有例题讲解,如哪里有讲的不好或者有不懂的欢迎在评论区指正,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值