C语言函数学习笔记

C语言函数笔记

1.函数中基本概念

形参:在函数中定义的参数,可以代表任何数据;
实参:函数调用时指明的参数,代表实际数据。
函数调用时,主调函数将实际参数传给形参,供被调用函数使用。
全局变量:在所有函数之外定义的,重名时会被局部参量覆盖,但通过::a=又可以更改啦
子函数写在了输入值定义之前,可以在里面写extern int a.

2.函数定义与使用:

2.1函数定义:

C1
基本结构:
返回类型   函数名(形参表)      //函数头(函数原型):若函数没有返回类型,用关键字void说明;函数名用标识符表示;形参表表述各个形参的类型和名字,用逗号隔开。
{
  变量说明
  执行语句
}                      //函数体:函数内定义的局部变量只能在函数内被访问。调用时才为局部变量分配空间,用完即释放(属于动态内存分配)
                       //注意不能嵌套定义   
eg.定义一个求最小值的小函数:
int min(int a,int b)
{
if(a>b)return b;
else return a;
}

2.2函数原型说明、调用、返回

  • 原型说明:在主函数之前先对需调用的函数进行说明,使编译器明确被调用函数的形参和返回值类型。(一般放在所有函数的定义前)

返回类型 函数名(形参表); //其实就是函数原型后面加分号

  • 函数调用:在主函数内部调用

函数名(实参表)

  • 函数返回:被调函数取得的结果通过return返回到主函数

return 表达式;

C2
eg.
#include<stdio.h>
#include<stdlib.h>
int sqr(int x);//函数原型说明
int main(){
int t=10;
printf("%d是%d的平方",sqr(t),t);//函数调用
system("pause");
return 0;
};
int sqr(int x)//定义子函数,x是形式参数
{
x=x*x;
return(x);//返回到x,输入主函数,而非返回到0
}
运行结果为:
10010的平方
请按任意键继续. . .

2.3参数传递方式

  • 传值:如上代码C2,实参直接复制给形参,在子函数体中改变形参不影响实参。(缺点是大量数据传送时复制数据花费大量时间和内存)
  • 传地址:指针类型的实参对应实参的地址,函数调用时指针指向地址,函数可以通过间接访问的方式来修改数据。(另外,要输出由形参来改变成功的实参,也可以通过函数返回指针,见C5)
C3区别一下传值传地址,传值时,形参和实参分别在不同的储存空间中,在子函数体中做的改变只能改形参,对实参无用;传地址后实参形参合二为一,通过变形参间接访问实参,两者一同运算。
交换两个整型变量的值
eg.1 wrong 传值
#include<stdio.h>
#include<stdlib.h>
void swap(int a,int b);
int main(){
int m,n;
printf("please input two numbers");
scanf_s("%d%d",&m,&n);
sawp(m,n);//实参m,n的值复制给了a,b;然后a,b在子函数中自己交换值了,但m,n已经静止,没有再发生改变
printf("after swapping,two numbers are:%d,%d\n",m,n);
system("pause");
return 0;
}
void swap(int a,int b)
{
int t=a;
a=b;
b=t;
}
eg2.correct 传地址
#include<stdio.h>
#include<stdlib.h>
void swap(int *a,int *b);
int main(){
int m,n;
printf("please input two numbers");
scanf_s("%d%d",&m,&n);
sawp(&m,&n);
printf("after swapping,two numbers are:%d,%d\n",m,n);
system("pause");
return 0;
}
void swap(int *a,int *b)//需从主调函数里copy的形参表才写在这里
{
int temp;//temp只是子函数自用,定义写在{内
temp=*a;
*a=*b;
*b=temp;
}//a,b指向m,n的地址,函数被调用的时候*a指向动态的实参m,*b指向动态实参n,m与n真地被交换

C4:
数组做参数:
eg.数组中存放了一个学生的5门课,求平均成绩
#include<stdio.h>
#include<stdlib.h>
float aver(float a[],int n);
int main(){
float sco[5],av;
int i;
printf("\n please input 5 scores:\n");
for(i=0;i<5;i++)
scanf_s("%f",&sco[i]);
av=avr(sco,5);//数组作为参数来调用子函数
printf("the average score is %6.2f\n",av);
system ("puase");
return 0;
}
float aver(float a[],int n)//形参可以是数组
{
int i;
float av,s=a[0];
for(i=0;i<n;i++)
s=s+a[i];
av=s/n;
return av;
}

2.4函数返回指针

函数内部数据的地址返还给子函数,主函数最后输出的是形参

类型定义符 *函数名(形参列表)
{函数体}

C5函数返回指针
eg.在字符串中寻找某个给定字符,找到则打印余下字符,以及该字符序数,未找到则输出“not matched"
#include<stdio.h>
#include<string.h>
const int LEN = 80;
char* match(char c, char* sp);
int main() {
	char s[LEN], ch, * p;
	int pos;
	printf("请输入待查找字符串\n");
	gets_s(s);
	printf("请输入待查找字符\n");
	ch = getchar();
	p = match(ch, s);
	if (p)
	{
		pos = strlen(s) - strlen(p) + 1;//位置序号
		printf("%s %d\n",p, pos);
	}
	else
		printf("not matched");
}
char* match(char c, char* sp)//定义返回值是指针的函数
{
	int count = 0;
	while (c != sp[count] && sp[count] != '\0')
		count++;
	if (sp[count])
		return(&sp[count]);//返回子函数的字符串,最终输出的也是形参
}

2.5递归函数

  • 自己调用自己,通过加上条件判断来终止。
  • 过程:1)递归。原始问题不断小化,达到递归终结条件;
    2)回溯。由已知出发,沿递归逆过程,逐一求值返回。
long gcd1(int a,int b)
{
	if (a % b == 0)return b;//要是前除以后除得尽,就输出后面的值(这也是递归结束的必要条件!)
	return gcd1(b, a % b);//不然就又让b成为被除数,a%b成为除数,重复操作,直至前除后可以除尽
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值