函数
1.函数是什么
c语言中函数的分类
- 库函数
c语言本身提供给我们的函数,比如printf
库函数分类:
io函数
字符串操作函数
内存操作函数
时间日期函数
数学函数
其他函数
- 自定义函数
例如,写一个函数,找出两个数的较大值
int get_max(int x, int y )
{
if(x>y)
return x;
else
return y;
}
int main(){
int a = 10;
int b = 20;
int max = get_max(a,b);
printf("max = %d\n",max);
return 0;
}
写一个函数,交换两个整形变量的内容
上述代码中,xy和ab并没有关系,他们都是内存中独立创建的空间,所以并不能达到交换的目的
void swap(int* pa,int* pb)
{
int tmp = 0;
tmp = *pa; //*代表解引用,其实现在*pa就是a
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("a=%d b=%d\n",a,b);
swap(&a,&b);
printf("a=%d b=%d\n",a,b);
return 0;
}
2.函数的参数
- 实际参数
如上例中&a,&b
实参可以是常量、表达式、变量、函数 - 形式参数
如上例中int* pa,int* pb
当实参传给形参的时候,形参其实是实参的临时拷贝,对形参的修改是不会改变实参的(上例中也是这个道理)
3.函数的调用
- 传值调用
穿过去的是值,如上例的swap1函数
对于形参的修改不改变实参 - 传址调用
穿过去的是地址,如上例的swap2函数
打印100-200间的素数
int is_prime(int n)
{
//2到2-1的数去试试除
int j = 0;
for(j = 2;j<n;j++)
{
if(n%j == 0)
return 0;
}
return 1;
}
int main()
{
int i = 0;
for(i = 100;i<=200;i++)
{
if(is_prime(i) == 1)
printf("%d",i);
}
return 0;
}
判断一年是不是闰年
int is_leap_year(int y)
{
if((y%4==0&&y%100 !=0) || (y%400 ==0))
return 1;
else
return 0;
}
int main()
{
int year = 0;
for(year = 1000;year<=2000;year++)
{
if(1 == is_leap_year(year))
{
printf("%d",year);
}
}
return 0;
}
二分查找:在一个有序数组中查找具体的某个数
int binary_search(int arr[],int k,int sz)
{
int left = 0;
int right = sz -1;
while(left<=right)
{
int mid = (left + right)/2;//中间元素的下标
if(arr[mid]<k)
{
left = mid +1;
}
else if(arr[mid] > k)
{
right = mid -1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
//如果找到了返回这个数的下标,找不到的返回-1
int arr[] = {1,2,3,4,5,6,7,8,9,10}
int k = 7;
int sz = sizeof(arr)/sizeof(arr[0]);//注意求元素个数不可以放到函数内部中,因为传递过去的是数组arr首元素的地址
int ret = binary_search(arr,k,sz);
if(ret == 1)
{
printf("找不到指定的数字\n");
}
else
{
printf("找到了,下标是:%d\n",ret);
}
return 0;
}
void Add(int* p)
{
(*p)++;//因为++的优先级高,所以作用于p而不是…*p
}
int main()
{
int num = 0;
Add(&num);
printf("num = %d\n", num);
Add(&num);
printf("num = %d\n", num);
Add(&num);
printf("num = %d\n", num);
return 0;
}
- 函数的嵌套调用和链式访问
嵌套调用:一个函数中调用另一个函数
链式访问:把一个函数的返回值作为另一个函数的参数