我是靠谱客的博主 震动蚂蚁,最近开发中收集的这篇文章主要介绍【C语言】08-函数调用一、函数的定义二、函数的传参三、函数的调用四、函数与数组五、函数与指针,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
此笔记由个人整理
塞上苍鹰_fly
课程来自:尚观C语言
一、函数的定义
格式
- 数据类型 函数名 ([数据类型 形参名,数据类型 形参名,…])
#include "stdio.h"
#include "stdlib.h"
//argc:从终端计算传递多少个参数过来
//argv:用来保存从命令行传入传输的列表
int main(int argc,char *argv[])
{
int i;
printf("argc = %dn",argc);
//for(i = 0;i < argc;i++)
for(i = 0;argv[i] != NULL;i++)
puts(argv[i]);
return 0;
}
- 案例
#include "stdio.h"
#include "stdlib.h"
void print_hello(void)
{
printf("Hello!n");
}
int main()
{
print_hello();
return 0;
}
- 如果主调函数在上被调函数在下,则应该在被调函数应该在主调函数之前声明
#include "stdio.h"
#include "stdlib.h"
void print_hello(void);//声明
int main()
{
print_hello();
return 0;
}
void print_hello(void)
{
printf("Hello!n");
}
二、函数的传参
形参和实参
- 形参:不是实际存在变量,又称虚拟变量。
- 实参:在调用有参函数时,函数名后面括号中的参数为“实际参数”
值传递
- 直接传递数值,在被调用的函数中只能使用这个值,不能改变这个原始的值
- 案例
#include "stdio.h"
#include "stdlib.h"
int printf_value(int a,int b)
{
printf("i = %d,j = %dn",a,b);
return 0;
}
int main()
{
int i = 3,j = 5;
printf_value(i,j);
exit(0);
}
- 结果
地址传递
- 通过直接操作地址,来使用和更改这个值
- 案例
#include "stdio.h"
#include "stdlib.h"
int swap(int *p,int *q)
{
int tmp;
tmp = *p;
*p = *q;
*q = tmp;
return 0;
}
int main()
{
int i = 3,j = 5;
printf("befor-->i = %d,j = %dn",i,j);
swap(&i,&j);
printf("after-->i = %d,j = %dn",i,j);
exit(0);
}
- 结果
三、函数的调用
嵌套调用
- 嵌套多个函数实现一个功能
- 案例
#include "stdio.h"
#include "stdlib.h"
int maxfunc(int a,int b,int c)
{
int tmp;
tmp = a > b ? a : b;
return tmp > c ? tmp : c;
}
int minfunc(int a,int b,int c)
{
int tmp;
tmp = a < b ? a : b;
return tmp < c ? tmp : c;
}
int dist(int a,int b,int c)
{
return maxfunc(a,b,c) - minfunc(a,b,c);
}
int main()
{
int a = 3,b = 5,c = 10;
int res;
printf("a = %d,b = %d,c = %dn",a,b,c);
res = dist(a,b,c);
printf("dist = %dn",res);
exit(0);
}
- 结果
递归
- 函数直接或间接的嵌套自身
- 案例1
#include "stdio.h"
#include "stdlib.h"
int a()
{
printf("[a]begin!n");
printf("[a]call b()!n");
b();
printf("[a]b() returned!n");
printf("[a]end!n");
}
int b()
{
printf("[b]begin!n");
printf("[b]call c()!n");
c();
printf("[b]c() returned!n");
printf("[b]end!n");
}
int c()
{
printf("[c]begin!n");
printf("[c]end!n");
}
int main()
{
printf("[main]begin!n");
printf("[main]call a()!n");
a();
printf("[main]a() returned!n");
printf("[main]end!n");
return 0;
}
- 结果
递归解决阶乘
#include "stdio.h"
#include "stdlib.h"
int func(int n)
{
if(n < 1)//非法条件
return -1;
if(n == 1 || n == 2)//已知条件
return 1;
return n * func(n - 1);
}
int main()
{
int n;
int res;
printf("please enter a number:");
scanf("%d",&n);
res = func(n);
if(res == -1)
printf("enter errorn");
else
printf("%d! = %dn",n,res);
return 0;
}
- 结果
递归解决斐波那契
#include "stdio.h"
#include "stdlib.h"
int fib(int n)
{
if(n < 1)//非法条件
return -1;
if(n == 1 || n == 2)//已知条件
return 1;
return fib(n-1) + fib(n-2);
}
int main()
{
int n;
int res;
printf("please enter a number:");
scanf("%d",&n);
res = fib(n);
if(res == -1)
printf("enter errorn");
else
printf("fib[%d]= %dn",n,res);
return 0;
}
- 结果
四、函数与数组
函数与一维数组
- 在传参中不光要传送数组的地址,还要传送这个数组有多少元素
传参案例
int a[N] = {1,2,3,4,5,6};
int *p = a;
->a *a a[0] &a[3] p[i] p *p p+1
->int* int int int * int int* int int*
案例1:传参显示
#include "stdio.h"
#include "stdlib.h"
//void printf_arr(int *p,int n)
void printf_arr(int p[],int n)
{
int i;
for(i = 0;i < n;i++)
printf("%d ",*(p+i));
printf("n");
}
int main()
{
int a[] = {1,3,5,7,9};
printf_arr(a,sizeof(a)/sizeof(*a));
exit(0);
}
- 结果
案例2:数组传参倒序显示
#include "stdio.h"
#include "stdlib.h"
void func(int *p,int n)
{
int i = 0,j,tmp;
int m = (n-1)/2;
for( ;i <= m;i++)
{
j = n-1-i;
tmp = p[i];
p[i] = p[j];
p[j] = tmp;
}
}
int main()
{
int a[] = {1,3,5,7,9};
int i;
for(i = 0;i < sizeof(a)/sizeof(*a);i++)
printf("%d ",a[i]);
printf("n");
func(a,sizeof(a)/sizeof(*a));
for(i = 0;i < sizeof(a)/sizeof(*a);i++)
printf("%d ",a[i]);
printf("n");
exit(0);
}
- 结果
函数与二维数组
传参案例
int a[M][N] = {...};
int *p = *a;
int (*q)[N] = a;
-> a[i][j] *(a+i)+j a[i]+j p[i] *p
q[i][j] *q q p+3 q+2
-> int int * int * int int
int int * int (*)[N] int * int (*)[N]
案例1:
#include "stdio.h"
#include "stdlib.h"
#define M 3
#define N 4
void printf_arr(int *p,int n)
{
int i;
for(i = 0;i < n;i++)
{
printf("%4d ",p[i]);
}
printf("n");
}
int main()
{
int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf_arr(&a[0][0],M*N);//*a a[0] *(a+0)
exit(0);
}
案例2:
#include "stdio.h"
#include "stdlib.h"
#define M 3
#define N 4
void printf_arr(int (*p)[N],int m,int n)
{
int i,j;
for(i = 0;i < m;i++)
{
for(j = 0;j < n;j++)
{
printf("%4d ",*(*(p+i)+j));
}
printf("n");
}
printf("n");
}
int main()
{
int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf_arr(a,M,N);
exit(0);
}
案例3:二维数组学生成绩
#include "stdio.h"
#include "stdlib.h"
#define M 3
#define N 4
float average_score(int *p,int n)
{
int i;
float sum = 0;
for(i = 0;i < n;i++)
sum += p[i];
return sum/n;
}
void find_num(int (*p)[N],int num)
{
int i;
for(i = 0;i < N;i++)
printf("%d",*(*(p+num)+i));
printf("n");
}
int main()
{
float ave;
int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};
int num = 1;
ave = average_score(*a,M*N);
printf("ave = %fn",ave);
find_num(a,num);
exit(0);
}
- 结果
函数与字符数组
案例1:实现strcpy
#include "stdio.h"
#include "stdlib.h"
char *mystrcpy(char *dest,const char *src)
{
char *ret =dest;
if(dest != NULL && src != NULL)
while((*dest++ = *src++) != '