c语言从0->1入门——函数(二)
关于作者:
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在上一个大括号后就已经结束
变量的生命周期:
全局变量的生命周期是永恒的,也就是说在程序运行中该变量始终可以调用,
局部变量的生命周期是短暂的,也就是说该局部变量的生命周期等同于作用域的存在时期
下面我们来说一个初学者考虑比较少的,但是要知道,变量名重复问题。
- 不同函数内的变量允许重名
- 当俩个变量不存在于同一个大括号是允许重名,优先选取本大括号中的变量
- 当重名时,就近原则
下面我们用一个代码来看变量重名:
#include<stdio.h>
int a = 10;
int main()
{
int a = 1;
if (1)
{
int a = 1000;
printf("a=%d", a);
}
return 0;
}
练习:
- 使用自定义函数来返回给定整数数组中的最大值
- 使用递归函数来返回斐波那契数列的第20号值
关于练习讲解我会放到下一篇文章的开头来讲解
- 点赞
- 收藏
- 关注作者
评论(0)