29.【C语言】自定义函数

1、自定义详解

*提示:先看第12,19篇

例:写一个程序交换两个变量的值

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void swap(int x, int y)
{
	int z = 0;
	z = x;
	x = y;
	y = z;
}
int main()
{
	int a = 10;
	int b = 20;
	swap(a, b);
	printf("%d %d",a, b);
}

函数名前些void,表示无返回类型,即不需要写return xxx;

输出结果显示:a,b并没有交换

打开调试模式,键入F11,打开监视

程序执行一遍后:

x和y的值虽然被交换,但是a和b的值并没有交换

原因:由&a &b &x &y知道:a和x的地址不同,b和y的地址不同

另一种解释(见第3点):swap在被调用时,实参(a,b)传给形参(x,y),形参是实参的临时拷贝,所以改变形参,不改变实参

解决方案:回想第19篇用地址(*pa)来控制变量(a),让a和x,b和y建立联系

-->把a,b的地址交给自定义函数的指针

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void swap(int* pa, int* pb)
{
	int z = 0;
	z = *pa;
	*pa = *pb;
	*pb = z;//*pa等效于main函数中的a,*pb等效于main函数中的b
}
int main()
{
	int a = 10;
	int b = 20;
	swap(&a, &b);
	printf("%d %d",a, b);
}

 

&a和&*pa,&b和&*pb一样

2.疑问解答:

Q:为什么第12篇创建函数时为什么没有使用指针?

A:第12篇讲的是求两个数的和,并没有改变输入的x和y,因此不用指针。所以自定义函数要使用指针的前提是改变变量

3.函数的参数

实际参数(实参):
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类
型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配
内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在
函数中有效(生命周期类似局部变量)。

如:swap(a,b);的a和b是实际参数,swap(2,3)的2和3是实际参数,void swap(m,n)的m和n是形式参数

4.函数的调用方式

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

void swap(int x, int y)
{
	int z = 0;
	z = x;
	x = y;
	y = z;
}


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

void swap(int* pa, int* pb)
{
	int z = 0;
	z = *pa;
	*pa = *pb;
	*pb = z;
}

相关推荐

  1. C语言自学笔记9----用户定义函数

    2024-07-14 22:36:03       33 阅读
  2. C语言题目:字符提取(定义函数

    2024-07-14 22:36:03       39 阅读
  3. C语言——定义类型

    2024-07-14 22:36:03       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 22:36:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 22:36:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 22:36:03       58 阅读
  4. Python语言-面向对象

    2024-07-14 22:36:03       69 阅读

热门阅读

  1. 极速构建的艺术:Kylin中Cube的并行构建实践

    2024-07-14 22:36:03       21 阅读
  2. 设计模式的分类

    2024-07-14 22:36:03       16 阅读
  3. Docker--在linux安装软件

    2024-07-14 22:36:03       22 阅读
  4. OpenJudge | 回文串判断

    2024-07-14 22:36:03       22 阅读
  5. C++数组

    2024-07-14 22:36:03       19 阅读
  6. 数仓工具—Hive语法之正则表达式函数

    2024-07-14 22:36:03       21 阅读
  7. 【Lua】lua实现C# continue效果

    2024-07-14 22:36:03       17 阅读
  8. 探索TASKCTL和 DataStage 的ETL任务调度协同

    2024-07-14 22:36:03       17 阅读
  9. TCPDump协议分析工具

    2024-07-14 22:36:03       20 阅读