1.定义
一个用来完成特定功能的代码模块
2.三要素
功能、参数、返回值
3.格式
存储类型 数据类型 函数名 (参数列表){
函数体;
return 表达式;
}
- 没有参数:参数列表可以省略,也可以用void
- 没有返回值:数据类型为void,函数内部没有return语句
注意:定义子函数式,可以直接定义在main函数上面,也可以定义在main函数下面,但是需要提前声明函数。
4.函数声明
存储类型 数据类型 函数名(参数列表);//形参
5.函数调用
-
没有返回值:直接调用:函数名(实参);
-
有返回值:如果需要接收返回值就定义和返回值类型相同的变量去接收,如果不需要接收返回值,就直接调用。
练习1:编写一个函数,函数的2个参数,第一个是一个字符,第二个是一个char *,
返回字符串中该字符的个数。
int num(char ch,char * p)//遍历字符串,过程中判断*p是否等于ch
{
int t=0;
while(*p != '\0')
{
if(*p == ch)
t++;
p++;
}
return t;
}
6.函数传参
1.值传递
单向传递,将实参传递给形参使用,改变形参不会反向影响实参
2.地址传递
双向传递,在函数中修改形参,实参会随之改变
3.数组传递
和地址传递一样,参数中存在数组定义,会认为是指针
练习:封装函数实现两个数的交换
#include<stdio.h>
void exchange(int *a,int *b){
int c;
c=*a;
*a=*b;
*b=c;
}
int main(int argc, char const *argv[])
{
int a,b;
scanf("%d %d",&a,&b);
exchange(&a,&b);
printf("a=%d,b=%d",a,b);
return 0;
}
补充:
char *p = “hello”;
//p在栈区开辟4字节空间,存放hello字符串首地址
//hello存在常量区
char buf[32]=“hello”;
//buf:在栈区开辟32个字节空间,存放“hello”字符串。