传值调用:在这种方式下,函数内部对参数进行的任何修改都不会影响到函数外的实参。实质上,是将实参的值复制了一份传递给函数。
void swap(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
printf("In swap: %d %d\n", x, y);
}
int main() {
int a = 10;
int b = 20;
swap(a, b);
printf("After swap: %d %d\n", a, b);
return 0;
}
传址调用:传址调用是指函数参数传递的是参数的内存地址,若函数内部对参数进行修改,将影响到函数外的实参。
void swap(int *x, int *y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
printf("In swap: %d %d\n", *x, *y);
}
int main() {
int a = 10;
int b = 20;
swap(&a, &b);
printf("After swap: %d %d\n", a, b);
return 0;
}
举例
函数判断是不是素数
#include <math.h>
int is_prime(int num) {
if (num <= 1) {
return 0; // 小于等于1的数不是素数
}
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return 0; // 能被整除则不是素数
}
}
return 1; // 否则是素数
}
int main() {
int num = 29;
if (is_prime(num)) {
printf("%d 是素数\n", num);
} else {
printf("%d 不是素数\n", num);
}
return 0;
}
函数判断是否为闰年
#include <stdio.h>
int is_leap_year(int year) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
return 1; // 是闰年
} else {
return 0; // 不是闰年
}
}
int main() {
int year;
printf("Enter a year: ");
scanf("%d", &year);
if (is_leap_year(year)) {
printf("%d is a leap year.\n", year);
} else {
printf("%d is not a leap year.\n", year);
}
return 0;
}
函数实现整型有序数组的二分查找
#include <stdio.h>
int binary_search(int arr[], int k, int sz)//形参
{
int left = 0; //左下标
int right = sz - 1; //右下标
//使用while循环
while (left <= right)
{
//生成中间值下标 mid :
int mid = left + (right - left) / 2;
//二分查找:
if (arr[mid] < k)//中间值 小于 要找的值
{
left = mid + 1;
//舍弃中间值和中间值左边的所有数,
//调整 左下标left :left = mid + 1。
}
else if (arr[mid] > k)//中间值 大于 要找的值
{
right = mid - 1;
//舍弃中间值和中间值右边的所有数,
//调整 右下标right :right = mid - 1。
}
else if (arr[mid] == k)//中间值 等于 要找的值
{
return mid;
//返回中间值下标mid。
}
}
if (left > right)
{
return -1; //找不到则返回-1
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //定义有序数组
int k = 7; //设置要查找的值
int sz = sizeof(arr) / sizeof(arr[0]); //求出数组元素个数
// 整个数组大小 / 单个数组元素大小 = 数组元素个数
//调用自定义函数:
int ret = binary_search(arr, k, sz); //ret接收返回的下标
//判断自定义函数的返回值,打印相应的情况:
if (ret == -1) //未找到,返回-1
{
printf("找不到\n");
}
else
{
printf("找到了,下标是:%d\n", ret);
}
return 0;
}