函数的声明与定义
函数的声明
函数的声明概念和作用如下
1.函数的声明就是告诉编译器有一个函数叫什么,参数是什么,返回值类型是什么。但具体是不是存在,函数声明解决不了
2.函数声明一般出现在函数的使用之前。要满足先声明后使用。
3.函数的声明一般在头文件中。
我们在代码中为大家演示函数声明的具体用法
int main()
{
int num1 = 20;
int num2 = 10;
int max = get_max(num1, num2);
printf("%d", max);
return 0;
}
int get_max(int x, int y)
{
return(x > y ? x : y);
}
还是之前使用函数求解两个数的最大值的代码,这次我们把自定义函数放在了主函数之后,我们让代码跑起来
虽然我们也可以得到我们的结果但是编译器会有一条警告
他说我们的“get_max"
未定义,这里我们就需要使用函数的声明来消除这个警告。
当我们的自定义函数在主函数之后,我们要调用自定义函数时,需要使用函数的声明,在调用之前告诉编译器有这样一个函数,这就是:函数声明一般出现在函数的使用之前,要满足先声明后使用。
函数的定义
顾名思义函数的定义就是函数的具体实现,交代函数的功能实现。当我们了解到了函数声明与定义,那么在日常的工作中我们应该怎样去写函数的声明和定义呢?在日常工作中一定不会向上面的代码一样去声明函数,函数的声明和定义一定是分开的。例如
我们可以看到这个源文件里面并没有定义get_max()
这个函数,也没有函数的声明,但是我们执行代码依然可以得到我们想要结果这是为什么呢?原因是,我们将函数的声明和定义分成了两个部分,在不同的位置进行书写
这样写的好处是,可以将我们的需求分成多个模块进行编写,最后将他们并在一起就可以达到我们想要的效果,关于这方面我们在以后的学习当中在与大家详细的分享,今天大家只要知道什么是函数的声明和定义就好了。
简单的练习题
经过我们的分享,相信大家对函数也有了一定的认识,今天我们带领大家练习几个题目,来回顾一下之前的知识。
写一个函数可以判断一个数是不是素数
在之前的练习中我们也写过这样的题目,那么如何使用函数实现呢?
int prime_number(int x)
{
int j = 0;
for (j = 2; j < x; j++)
{
if (x % j == 0)
{
return 0;
}
}
if (j == x)
{
return 1;
}
}
int main()
{
int num = 0;
printf("输入一个数:");
scanf("%d", &num);
int i = prime_number(num);
if (1 == i)
{
printf("%d是素数", num);
}
else
{
printf("%d不是素数",num);
}
}
思路分析:首先我们创建变量用于接收我们输入的待判断数,将这个数传给自定义函数,进行判断如果返回值为1那么就是素数,自定义函数实现判断部分,如果是素数就返回1,不是就返回0。
写一个函数实现二分查找
//使用函数实现整形有序数组的二分查找
int binary_search(int arr[])
{
int left = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int right = sz - 1;
int k = 0;
printf("请输入要查询的数组元素:");
scanf("%d", &k);
while (left <= right)
{
int mid = (right - left) / 2 + left;
if (k > arr[mid])
{
left = mid + 1;
}
else if (k < arr[mid])
{
right = mid - 1;
}
else
{
return mid;
}
}
if (left > right)
{
return -1;
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int num = binary_search(arr);
if (num == -1)
{
printf("找不到了");
}
else
{
printf("找到了,下标为%d", num);
}
return 0;
}
思路分析:我们首先创建一个整形有序数组,将数组传给自定义函数进行寻找,如果可以找到则返回待查值的数组下标,如果招不到返回-1,通过返回值进行选择输出,给出用户对应提示。写完后我们执行我们的代码
我们发现,查找数组当中存在的元素时,提示我们找不到,这是哪里出现了问题呢?我们在调试中寻找答案
我们发现原来是我们的right
的值出现了错误,数组当中明明有10个元素,right应该等于9,为什么变成1了呢?答案就在于,数组在传递参数的时候不会把整个数组都进行传递,只需要传递数组的首元素地址就可以找到数组当中的任意元素了,所以在数组传递参数时不仅仅可以使用上面int binary_search(int arr[])
这样的写法,还可以写成int binary_search(int *arr)
,后者比较难理解,但是揭露了本质,数组传递参数其实是数组首元素的传递。所以我们将我们的代码进行更改:
//使用函数实现整形有序数组的二分查找
int binary_search(int arr[], int sz)
{
int left = 0;
int right = sz - 1;
int k = 0;
printf("请输入要查询的数组元素:");
scanf("%d", &k);
while (left <= right)
{
int mid = (right - left) / 2 + left;
if (k > arr[mid])
{
left = mid + 1;
}
else if (k < arr[mid])
{
right = mid - 1;
}
else
{
return mid;
}
}
if (left > right)
{
return -1;
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int num = binary_search(arr, sz);
if (num == -1)
{
printf("找不到了");
}
else
{
printf("找到了,下标为%d", num);
}
return 0;
}
我们将right()
这个变量的值放在主函数当中求出,之后传递给自定义函数就可以实现我们的需求了。
写一个函数,每调用一次这个函数,就会将 num 的值增加1。
通过题目我们知道了,需要定义一个函数来使主函数当中数的值+1,这样函数内外需要建立一定的联系,我们使用传址调用。
#include<stdio.h>
void add(int* pnum)
{
*pnum = *pnum + 1;
}
int main()
{
int num = 0;
add(&num);
printf("%d", num);
return 0;
}