传值调用:在这种方式下,函数内部对参数进行的任何修改都不会影响到函数外的实参。实质上,是将实参的值复制了一份传递给函数。
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;
}