c语言从0->1入门——函数(二)

举报
秋名山码民 发表于 2022/05/15 23:36:00 2022/05/15
【摘要】 关于作者:2019NOIP退役成员,学习c语言已有多年经验,更懂得考试的题目,和初学者学习时所遇到的问题华为云享专家,以及CSDN的新星创作者,有写博客的一定能力 关于本栏目本栏目的宗旨是带你入门c语言,作者打算用题海+c语言的概念来完成本栏目,适用人群:面向广大的编程爱好者和大学生来进行创作学完本栏后你能达到的水平:计算机二级水平左右,入门c语言学习题目:主要来源于网络和c语言的入门算法...

关于作者:

2019NOIP退役成员,学习c语言已有多年经验,更懂得考试的题目,和初学者学习时所遇到的问题

华为云享专家,以及CSDN的新星创作者,有写博客的一定能力

关于本栏目

本栏目的宗旨是带你入门c语言,作者打算用题海+c语言的概念来完成本栏目,

适用人群:面向广大的编程爱好者和大学生来进行创作

学完本栏后你能达到的水平:计算机二级水平左右,入门c语言学习

题目:主要来源于网络和c语言的入门算法题目

写在前面的话(第十天)

记住我们的宗旨:努力去做,让一切交给时间来评判!

函数参数

上讲我们说了函数的形参和实参,这节从开始我们先来用案例来表现一下,更直观的来看出他们的不同。

交换数字

#include<stdio.h>
void swap(int a, int b);//函数声明
int main()
{
	int a, b;
	scanf_s("%d%d", &a, &b);
	printf("%0x %0x\n", &a, &b);
	swap(a, b);
	printf("%d %d", a, b);
	return 0;
}
void swap(int a, int b)
{
	int	temp = 0;
	a = temp;
	a = b;
	b = temp;
	printf("%0x %0x\n", &a, &b);
}

在这里插入图片描述
可以看出程序并没有交换a,b的值,形参与实参的地址也不同
在这里插入图片描述

原因:函数传递参数的传值调用方法,把参数的实际值复制给函数的形式参数,然而俩种参数的地址不同。在这种情况下,修改函数内的形式参数不会影响实际参数。
解决方法:改为引用调用的方法,取地址,要用到指针操作,具体细节我们下一讲会提到
c中默认为传值调用

#include<stdio.h>
void swap(int *a,int *b);//函数声明
int main()
{
	int a, b;
	scanf_s("%d%d", &a, &b);
	swap(&a, &b);
	printf("%d %d", a, b);
	return 0;
}
void swap(int *a, int *b)
{
	int temp;
	temp = *a;    /* 保存地址 a 的值 */
	*a = *b;      /* 把 b 赋值给 a */
	*b = temp;    /* 把 temp 赋值给 b */
}

全局变量与局部变量在函数中的表现

函数外面定义的为全局变量
函数内变量和参变量为局部变量

原则上如果能用局部变量完成,尽可能不用全局变量

局部变量的作用域:
从定义处开始生效,然后到该变量所在的大括号后结束

int i=10;
while(i>0)
{
	int sum=0;
	sum += i;
	i--;
}
printf("%d",sum);//报错,sum在上一个大括号后就已经结束

变量的生命周期:

全局变量的生命周期是永恒的,也就是说在程序运行中该变量始终可以调用,
局部变量的生命周期是短暂的,也就是说该局部变量的生命周期等同于作用域的存在时期

下面我们来说一个初学者考虑比较少的,但是要知道,变量名重复问题。

  1. 不同函数内的变量允许重名
  2. 当俩个变量不存在于同一个大括号是允许重名,优先选取本大括号中的变量
  3. 当重名时,就近原则

下面我们用一个代码来看变量重名:

#include<stdio.h>
int a = 10;
int main()
{
	int a = 1;
	if (1)
	{
		int a = 1000;
		printf("a=%d", a);
	}
	return 0;
}

练习:

  1. 使用自定义函数来返回给定整数数组中的最大值
  2. 使用递归函数来返回斐波那契数列的第20号值

关于练习讲解我会放到下一篇文章的开头来讲解

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。