调用分为:
传值调用-形参和实参占用不同存块,对形参修改不影响实参
传址调用-调用的地址,函数内部可以直接操作函数外部变量
练习:
- 写一个函数判断一个数是不是素数。
- 写一个函数判断一年是不是闰年。
- 写一个函数,实现一个整型有序数组的二分查找。
- 写一个函数,每调用一次这个函数,就会将num的值增加1。
第一题:
首先我们构建一个想法如何使用我的函数。
int main()
{
//打印100-200之间所有素数
int i = 0;
for (i = 100; i <= 200; i++)
{
//判断i是否为素数的函数
if (is_prime(i) == 1)
{
printf("%d\n", i);
}
}
}
然后根据上述,is_Prime应该是一个可以判断数是否是素数的函数,是就return 1.
函数如下:
int is_prime(int n)
{
//判断n是否是素数,用2到n-1的所有数试出他
int j = 0;
for (j = 2; j < n; j++)
{
if (n % j == 0)
return 0;
}
return 1;
}
解释:也就是我在函数中再设立一个循环,用变量j去遍历我的n,j循环从2到n-1一直除n如果有一个结果n%j==0,则返回0,n不为素数,如果没有,循环执行结束继续往下执行return 1,n为素数。
第二题:判断是否为闰年的函数
int is_leapyear(int n)
{
//判断是闰年返回1,不是闰年返回0
if (n % 4 == 0)
{
if (n % 100 != 0)
return 1;
else
return 0;
}
else
return 0;
}
int main()
{
//打印1000-2000年所有闰年
int y = 0;
for (y=1000;y<=2000;y++)
{
//判断i是否为素数
if (is_leapyear(y) == 1)
{
printf("%d\n", y);
}
}
return 0;
}
代码运行:
这里我看别人写的更简单一点而且可以被400整除的也是闰年,我的条件不够正确,修改一下!
int is_leapyear(int n)
{
//判断是闰年返回1,不是闰年返回0
if ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
return 1;
else
return 0;
}
即使是100的倍数,但是只要是400的倍数,也是闰年,所以函数应该这么修改!
第三题:
int binary_search(int a[],int k,int s)
{
//二分法!
int left = 0;
int right = s - 1;
while (left<=right)
{
int mid = (left + right) / 2;
if (a[mid] > k)
{
right = mid - 1;
}
else if (a[mid] < k)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
//在这个数组里找7
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int key = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
//找到则返回位置的下标,找不到则返回-1.
int ret=binary_search(arr,key,sz);//在sz长度的arr数组里找到key这个值!所以函数需要设立3个参数
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是:%d\n", ret);
}
return 0;
}
代码运行:
第四题:
void add(int* p)
{
(*p)++;
}
int main()
{
int num = 0;
add(&num);
printf("%d\n", num);
add(&num);
printf("%d\n", num);
add(&num);
printf("%d\n", num);
return 0;
}
想要通过函数改变外部变量,那么需要指针,在函数里指向外部变量的地址才可以改变外部变量。