函数的格式
存储类型 数据类型 函数名(参数列表)
{
函数体;
return 表达式;
}
1)没有参数
参数列表可以省略,也可以用void类型。
2)没有返回值
数据类型为void,函数内部没有return
3)有返回值
要根据返回值的类型定义函数的数据类型
注意:定义函数的时候可以定义在调用函数前面,也可以定义在后面,但是定义在后面要提前声明该函数。
例如:
#include<stdio.h>
void fun()
{
printf("hello,world!");
}
int main()
{
fun();//无参数无返回值
return 0;
}
想要用于主函数下面,则需要复制函数的第一行,加符号;放到前面
#include<stdio.h>
void fun();//复制函数的第一行,加符号;
int main()
{
fun();//无参数无返回值
return 0;
}
void fun()
{
printf("hello,world!");
}
函数声明
数据类型 函数名 (参数列表);
函数三要素
功能、参数、返回值
函数调用
(1) 没有返回值:函数名(实参);
(2) 有返回值:如果需要接收函数返回值,定义一个同种类型的变量来接收
如果不需要接收返回值就直接调用
简单编写一个函数,函数的2个参数,第一个是一个字符,第二个是一个char *,返回字符串中该字符的个数。
#include<stdio.h>
int fun(char x,char* y)
{
int sum = 0;
while(*y)
{
if(*y == x)
{
sum++;
y++;
}
}
return sum;
}
int main()
{
char c ='l';
char* p = "hello";
int ret = fun(c,p);//需要接收函数返回值,定义一个同种类型的变量来接收
printf("%d\n",ret);
return 0;
}
编程实现strlen函数的功能,strlen计算字符串实际长度,不包含’\0’
同上题一样的思路
#include<stdio.h>
int my_strlen(char* y)
{
int sum = 0;
while(*p)
{
sum++;
p++;
}
return sum;
}
int main()
{
char* p = "hello,world";
int ret = my_strlen(p);
printf("%d\n",ret);
return 0;
}
函数传参
1)值传递
单向传递,将实参传递给形参使用,改变形参,实参不会受影响
2)地址传递
双向传递,修改形参,实参会跟着改变
3)数组传递
和地址传递一样,参数中存在数组的定义,也认为是指针
封装函数实现两个数的交换
#include<stdio.h>
int fun(int *a,int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
int main(int argc, char const *argv[])
{
int num1=2;
int num2=5;
fun(&num1,&num2);//双向传递,修改形参,实参会跟着改变
printf("%d %d\n",num1,num2);
return 0;
}