2024年最全【C语言】玩转函数——关于函数,你需要知道的知识,如何在面试中通过工厂模式来给自己加分

最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

注意:
但是库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。

需要学会查询工具的使用:
MSDN(Microsoft Developer Network)
www.cplusplus.com
http://en.cppreference.com(英文版) http://ch.cppreference.com(中文版)

2.2自定义函数

大家有没有发现,库函数并不能解决所有的问题,比如说我今天要写一个自动刷牙的程序,可能库函数中根本就没有。这时候,就需要我们程序员自己来定义函数了

这就是自定义函数。
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。这给程序员一个很大的自由发挥的空间。

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

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

举个例子:

写一个函数找出两个整数中的最大值

#include <stdio.h>
//get\_max函数的设计
int get\_max(int x, int y) 
{
 return (x>y)?(x):(y);
}
int main()
{
 int num1 = 10;
 int num2 = 20;
 int max = get\_max(num1, num2);//调用函数
 printf("max = %d\n", max);
 return 0; 
 }


3、函数的参数

3.1实际参数(实参)

在调用有参函数时,主调函数和被调函数之间有数据传递关系。
在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”)。
实参可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

举个例子:

#include <stdio.h>
void Swap1(int x, int y)
 {
 int tmp = 0;
 tmp = x;
 x = y;
 y = tmp; }
void Swap2(int \*px, int \*py) {
 int tmp = 0;
 tmp = \*px;
 \*px = \*py;
 \*py = tmp; }
int main()
{
 int num1 = 1;
 int num2 = 2;
 Swap1(num1, num2);//实参可以是常量、变量或表达式
 printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
 Swap2(&num1, &num2);//实参可以是常量、变量或表达式
 printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
 return 0; }

3.1形式参数(形参)

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

上面Swap1和Swap2函数中的参数 x,y,px,py 都是形式参数。
在main函数中传给Swap1的num1,num2和传给Swap2函数的&num1,&num2是实际参数。

这里我们对函数的实参和形参进行分析
借用网上的一幅图
在这里插入图片描述
实参是调用函数传递的具体数据。实参对形参数据传递时时单向传递。在存储单元中是不同的单元.

在上面的Swap1函数,在调用过程中,形参x和y的值都发生了改变,但是在main函数中,num1和num2的值都未发生变化。所以说实参向形参的值的传递是单向的。

Swap2函数,由于把地址也传过去了,所以两个值都改变了,这也是下面所讲的传值调用与传址调用。

**【注意】**形参实例化之后其实相当于实参的一份临时拷贝。

4、函数的调用

4.1传值调用

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

举个例子,交换两个整数的值。

#include <stdio.h>


int Swap(int x, int y)//这里形参x,y占据的内存块与下面实参a,b占据的内存块是不同的
{
	int z = 0;
	z= x;
	x= y;
	y = z;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("交换前a=%d,b=%d\n", a, b);
	Swap(a, b);//这里实参a,b占据的内存块与上面形参x,y占据的内存块是不同的
	printf("交换后a=%d,b=%d\n", a, b);
	return 0;
}

在这里插入图片描述

我们可以看到,这里a与b的值并没有发生变化,因为**函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。**所以,实参a和b,传给形参x,y的时候,形参是实参的一份临时拷贝,改变形参变量x,y,是不会影响实参a和b.

4.2传址调用

1、传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
2、这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

举个例子,也交换两个整数的值

#include<stdio.h>
void Swap(int \*px, int \*py)//用指针接收a,b的地址
{
	int z = 0;
	z = \*px;
	\*px = \*py;
	\*py = z;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("交换前a=%d,b=%d\n", a, b);
	Swap(&a,&b);//把a,b的地址传到上面函数去
	printf("交换后a=%d,b=%d\n", a, b);
	return 0;
}

在这里插入图片描述在这里,我们可以了解到,如果把a和b的内存地址传过去给函数的时候,在函数中,我们就可以依照这个指针地址,传数据回来。让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

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

5.1嵌套使用

需要说明的是,C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。

举个例子:

void first\_line()
{
	printf("hello world\n");
}
void two\_line()
{
	int i = 0;
	first\_line();
}
int main()
{
	two\_line();
	return 0;
}

在这里插入图片描述main函数调用了two_line函数,而two_line函数调用了first_line函数。函数调用了函数,我们就说是函数的嵌套调用
**注意,**函数可以嵌套调用,但是不能嵌套定义。
什么意思?
就是说,我们不能在函数之中定义一个函数,举个例子:

在这里插入图片描述

5.2链式访问

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

我们举个例子。

#include <stdio.h>
int main()
{
    printf("%d\n", printf("%d", printf("%d", 43)));
    //注:printf函数的返回值是打印在屏幕上字符的个数
    return 0; }

在这里插入图片描述

6、函数的声明与定义

6.1函数的声明

  1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。
  2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
  3. 函数的声明一般要放在头文件中的。

函数声明的格式:

dataType functionName( dataType1 param1, dataType2 param2 … );

有了函数声明,函数定义就可以出现在任何地方了,甚至是其他文件、静态链接库、动态链接库等。

简单来说,“函数声明”的作用是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)

6.2函数定义

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

由于内容太多,这里只截取部分的内容。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

[外链图片转存中…(img-X1N8ueqv-1715095574646)]

[外链图片转存中…(img-oQ0SzD5E-1715095574646)]

由于内容太多,这里只截取部分的内容。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值