说到函数首先我们要明白函数的作用。函数可以将其理解为一个封装特定功能的集合体,起到简化主函数内容的作用,如果对程序有一定了解的话会知道,最后一个比较大的程序往往分为三部分,第一主函数部分,第二实现部分,第三声明部分。我们会习惯性的将代码放到实现部分,在声明部分进行声明,最后在主函数部分进行使用。如果将所有内容都放到主函数中会感到内容很杂乱无章。因此我们可以利用函数进行主函数内容的简化。
第一步我们来认识一下函数的基本结构一个函数所包括的部分包括
1.返回类型
2.函数名称(函数名可以自己随便定义,尽量有意义)
3.函数所传的参数
4.函数的主体内容
5.如果有返回类型需要一个相应的返回值
大致内容如下:
#include<stdio.h>
void print(int *arr,int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
print(arr,sz);
return 0;
}
//void表示不需要返回值,如果为int则返回一个整数,如果为char则返回一个字符,根据需要进行判断
//print为其函数名,通常以其目的进行命名
//括号里的内容为上传的参数类型,arr的首地址为指针类型,sz为整数,上传的参数需要与主函数内容相对应
//大括号里面的内容为函数的主体内容,也就是分装的函数
//该函数由于是void所以不需要返回类型
#include<stdio.h>
int my_strlen(char* ch, int sz)
{
int i = 0;
int count = 0;
while (ch[i]!='\0')
{
i++;
count++;
}
return count;
}
int main()
{
char ch[10] = "abcdefg";
int sz = sizeof(ch) / sizeof(ch[0]);
int ret=my_strlen(ch, sz);
printf("%d", ret);
return 0;
}
//上面的代码返回值为一个整形,所以最后要有return
值得我们注意的是,在主函数中使用的函数,函数名称要和自己创建的函数一致,所上传的参数也应该与上面创建的函数传参类型一致,否则就会报错,使得程序异常。
第一类:void函数和return函数
那么接下来我们就来详细进行一下函数的介绍。函数按返回值分可以分为void函数以及return函数。void函数不需要返回值,所以前面用void进行表明。而return函数在程序结束的时候会需要返回相应的类型。
1.void函数
这类函数我们可以直接使用它进行相应的打印操作,比如我们需要打印许多内容将其全部放到主函数中感觉很麻烦,那么我们就会分装一个void函数,进行相应的内容的打印。举个例子:
#include<stdio.h>
void print(int *arr,int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
print(arr,sz);
return 0;
}
2.return函数
return函数可以大致分为返回int,返回float,返回char。我们可以通过函数的返回值进行判断进一步操作。
#include<stdio.h>
int my_strlen(char* ch, int sz)
{
int i = 0;
int count = 0;
while (ch[i]!='\0')
{
i++;
count++;
}
return count;
}
int main()
{
char ch[10] = "abcdefg";
int sz = sizeof(ch) / sizeof(ch[0]);
int ret=my_strlen(ch, sz);
printf("%d", ret);
return 0;
}
上面的程序作用是模拟strlen来计算字符串的长度。由我们返回的数字可以直接得出字符串的长度,返回值为一个整型。下面是返回一个字符的函数表达,同样的浮点数的返回应用也与他们相同自己去试试吧!要灵活应用函数的返回值,这样可以省不少时间。
#include<stdio.h>
char choice(void)
{
char ch = 0;
scanf("%c", &ch);
return ch;
}
int main()
{
char ch=choice();
switch (ch)
{
case '*':
printf("今天很开心\n");
break;
case '#':
printf("程序也不太难嘛");
break;
}
return 0;
}
第二类:传值函数与传址函数
上面我们说了第一类函数的分类,那么接下来我们来根据第二类上传数据进行分类——传值函数和传址函数。
那我们的数组举例子,我们应该知道你把一个数组作为参数上传给一个函数之后函数所接收到的是这个数组的首地址(不太理解的可以在本人的博客中查找并阅读数组与结构体详解一章的内容,相信会对你有很大的帮助)那么我们函数所定义的参数类型要与之相对应。也应该是一个指针也就是接收地址的地方。这一类的函数我们把它称作传址函数,那么其他的直接上传一个数值的函数我们将他们叫做传值函数。
需要重点强调的是,函数是一个相对独立的单位,在其中改变的内容如果是传值调用的话不会对主函数的真实值进行改变,而传址函数就不同了,他会找到该数据在主函数中所取得地址并进行数据的改写。那么我们就需要仔细考虑一下什么时候使用传值函数什么时候使用传址函数了。
void change(int* i)
{
*i = 10;
}
int main()
{
int i = 0;
change(&i);
printf("%d", i);
return 0;
}
//传址函数可以在函数中改变主函数的变量内容。
#include<stdio.h>
void change(int i)
{
i = 10;
}
int main()
{
int i = 0;
change(i);
printf("%d", i);
return 0;
}
如上图所示,可以显著地发现传值函数和传址函数的区别。
重点!!函数的递归!!
函数的递归一定是函数这一部分的重难点,相信大家一定都或多或少的被函数的递归困扰过。在这里我就来带领大家解决这个难题。由于要讲清楚内容过长所以我们将会在一片全新的博客中讲述,你可以点击下面的链接进行查看,包教包会哦。
此上就是本篇博客的全部内容祝你天天开心。