通常用来完成特定功能的一段代码,把这段代码放在一起,形成一个函数。
(1)系统函数
操作系统给我们写好的,用的话直接调用就可以。
一些常见的系统函数:printf(); scanf(); rand(); strlen(); strcat();
(2)自定义函数
尽量函数名就能表达书函数的功能;
函数尽量有注释,函数的功能,函数的返回值类型,函数的参数。
1、函数的定义
定义在函数中的变量为局部变量,定义在函数外面的变量为全局变量。
无返回值 :void 函数名(形参数据类型 形参名)
有返回值:返回值数据类型 函数名(形参数据类型 形参名)
#include
//函数的定义
//无返回值
void fan() //void就是表示无返回值 fan是函数名
{
//函数功能的实现
}
//有返回值
int fun()//定义了一个返回值为整型的函数,函数名为fun
{
//函数功能实现
}
int main()
{
return 0;
}
定义函数名的要求:
1)函数名不能以数字开头;
2)函数名中不能含有除_的特殊字符
3)函数名尽量表达清楚函数功能及含义
2、函数的调用
1)函数必须调用才执行,不调用的函数就像没有写一样
2)使用函数前需要先声明函数再使用
3、函数的调用语法
函数名();
函数调用后先跳转到函数执行,执行后再跳转到调用处
示例:输入两个数,求两个数的和,写一个两个数的加法函数,并调用,再主函数中输出;
#include
int add(int x,int y)//定义了一个返回值类型整形的函数,函数名为add
{
int sum=x+y; //实现计算两个数的和
return sum;
}
int main()
{
int a=0,b=0; //定义两个整型变量
scanf("%d%d",&a,&b);//输入两个整数
printf("%d",add(a,b));//调用函数add()
return 0;
}
主调函数将实参传递给被调函数的形参,实参与形参的类型要一致,个数也要一致。
实参:主调函数要传递被调函数的数据,实参可以是常量也可以的是变量,实参的数量和数据类型要一一对应。
形参:再被调函数中定义的定义的变量 , 每一个变量都必须是自己的数据类型,每个形参之间用逗号隔开,形参的作用域只在它所在的函数
形参与实参之间是值传递。
示例:写一个求一个数的n次方的函数,主函数输入 2 3 求2的3次方,在主函数中输出
#include
int fun(int x,int y)//定义了返回值类型为整型的函数,函数名为fun,定义了两个整形的形参变量
{
//实现x的y次方的运算
int i=0,sum=1;
for(i=0;i
函数使用时注意:
调用时参数的个数与类型必须与定义一致
返回值必须预定义一致
return 的使用:
结束函数
return ;结束所在函数,可以和void函数搭配使用
return 值;结束函数的同时返回值,只要函数不是void函数就一定要写return,
//参数是主调函数传递给被调函数的值
//返回值是被调函数传递给主调函数的值
练习:主函数输入圆的半径,分别写两个函数,计算其面积,周长,并主函数输出,π用宏常量
#include
#define pi 3.14 //定义宏常量 全局使用
//声明函数,定义在主调函数后面的函数调时
//需要主调函数前面先先声明
float S(int r);
float L(int r);
int main()
{
int r=0;
scanf("%d",&r);
//调用函数
printf("面积为:%.2f,周长为:%.2f\n",S(r),L(r));
return 0;
}
float S(int r) //实现求圆的面积的函数
{
return pi*r*r;
}
float L(int r) //求圆的周长的函数
{
return 2*pi*r;
}
指针又称指针变量,指针变量视为一个变量,是存放地址的变量。
int *p; //定义了一个整型指针变量,指针变量名为p
//可以是int,char,float等
int *p=&a;//指针的初始化就是给指针一个初始地址
#include
int main()
{
int a=10;
int * p; //定义指针变量,* 定义指针变量
//给指针变量赋值
p=&a; //& 取地址运算符
//输出变量a的值
printf("a is %d\n",a);
//p已经存放了a的地址,通过p输出a的值
printf("*p is %d\n",*p); //* 取内容,通过p里面存放的地址(a的地址),找到a,获取a的值 *p -->a
return 0;
}
(1)直接赋值
a=0;//直接给变量赋值
(2)间接赋值
通过变量的地址进行赋值。
int a;
int *p = &a;
*p = 20; //分为两步1 取出p的值,就是a的地址 2 到那个地址去赋值(20)
示例:
#include
int main()
{
int a=10;
int * p; //定义指针变量,* 定义指针变量
//给指针变量赋值
p=&a; //& 取地址运算符
//直接赋值
a=20;
//间接赋值
*p=30; //分为两步1 取出p的值,就是a的地址 2 到那个地址去赋值(30) a-->30 实际上是改变了a的值
//输出变量a的值
printf("a is %d\n",a);
//p已经存放了a的地址,通过p输出a的值
printf("*p is %d\n",*p); //* 取内容,通过p里面存放的地址(a的地址),找到a,获取a的值 *p -->a
return 0;
}
#include
int main()
{
int a[5]={10,20,30,40,50};
//指针变量,存放数组a的地址
int *p=a; //数组名就是数组的首地址
printf("p is %p\n",p); //输出p的值 0x1100
printf("a is %p\n",a); //数组名就是数组的首地址
printf("&a[0] is %p\n",&a[0]); //数组第一个元素的地址
//输出a[0]的值
printf("a[0] is %d\n",a[0]);
printf("*p is %d\n",*p);
//输出a[1]的地址
printf("&a[1] is %p\n",&a[1]);
printf("p+1 is %p\n",p+1); // ? +sizeof(int) 1104
//输出a[1]的值
printf("a[1] is %d\n",a[1]);
printf("*(p+1) is %d\n",*(p+1));
return 0;
}
通过指针遍历数组
#include
int main()
{
int a[5]={10,20,30,40,50};
int *p=a;
int i=0;
//通过指针遍历数组
printf("p is %p\n",p);
for(i=0;i<5;i++)
{
printf("%d\n",*(p+i));
}
printf("p is %p\n",p);
return 0;
}
运算规则
运算规则:*(地址+整数)
地址+整数 得到一个 新的地址
地址+1 ==》 +sizeof(数据类型)
char *q;
q+1 ==>? +1 sizeof(char);
写一函数my_strlen,求一个字符串的长度, 要求: 不可以调用系统库函数strlen
#include
int my_strlen(char *p)
{
//p 字符串的首地址 *p ---》'\0' 'h' --> '\0'
int count=0,i=0;
while(*(p+i)!='\0')
{
count++;
i++;
}
return count;
}
int main()
{
char a[100];
scanf("%s",a); //hello
int t=my_strlen(a);
printf("%d\n",t);
return 0;
}
指针的常见用法之一:在被调函数中给主调函数中的变量赋值。
指针的常见用法之一:将数组作为实参传给被调函数。
数组作为函数的参数,一般传递两个参数。目的是为了在被调函数中操作主调函数中定义的数组。
1是 数组的首地址,2是 数组的长度。