博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C语言练习笔记-3

Posted on 2022-10-10 15:00  打工的外星人  阅读(23)  评论(0编辑  收藏  举报

函数的参数
实际参数(实参):
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,他们必须有确定的值,以便把这些值传送给形参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完之后就自动销毁了。因此形式参数只在函数中有效。
上面Swap1和Swap2函数中的参数x,y,px,py都是形式参数。在main函数中传给Swap1的num1,num2和传给Swap2函数的&num1,&num2是实际参数。
形参实例化之后其实相当于实参的一份临时拷贝。

函数的调用:
传值调用
函数的形参和实参分别占用不同的内存块,对形参的修改不会影响实参。
传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立真正的联系,也就是函数内部可以直接操作函数外部的变量。

判断一个数是不是素数
#include <stdio.h>
#include <math.h>
int is_prime(int n)
{
//2->n-1
int j=0;
for(j=2;j<=sqrt(n);j++)
{
if(n%j==0)
return 0;
}
return 1;
}
int main()
{
int i=0;
for(i=100;i<=200;i++)
{
//判断i是否为素数
if(is_prime(i)==1)
printf("%d\n",i);
}
return 0;
}

//写一个函数判断是否为闰年
#include <stdio.h>
int is_leap_year(int y)
{
if((y%100!=0 && y%4==0)|| (y%400==0))
return 1;
else
return 0;
}

int main()
{
int year=0;
for(year=1000;year<=2000;year++)
{
//判断year是否为闰年
if(1==is_leap_year(year))
{
printf("%d ",year);
}
}
return 0;
}

//写一个函数,实现一个整形有序数列的二分查找
#include <stdio.h>
//本质上arr是一个指针
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=11;
int sz=sizeof(arr)/sizeof(arr[0]);
//传递过去的是首元素的地址
int ret=binary_search(arr,k,sz);
if(ret == -1)
{
printf("找不到指定的数字\n");
}
else
{
printf("找到了,小标是:%d\n",ret);
}

return 0;
}
//写一个函数,每调用一次这个函数,就会将num的值增加1。
#include<stdio.h>
void Add(int* p)
{
(*p)++;
}
int main()
{
int num=0;
Add(&num);
printf("num=%d\n",num);//1
Add(&num);
printf("num=%d\n",num);//2
Add(&num);
printf("num=%d\n",num);//3
return 0;
}

函数的嵌套调用和链式访问
嵌套调用
#include<stdio.h>
void new_line()
{
printf("hhhhhhh\n");
}
void three_line()
{
int i=0;
for(i=0;i<3;i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
链式访问
把一个函数返回值作为另一个函数的参数。
#include<stdio.h>
int main()
{
int len=0;
//1
// len=strlen("abc");
// printf("%d\n",len);
//2
printf("%d\n",strlen("abc"));
return 0;
}

#include<stdio.h>
int main()
{
//只打印字符个数
printf("%d",printf("%d",printf("%d",43)));//4321
return 0;
}

函数的声明和定义
函数声明:
1、告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体不是存在,无关紧要。
2、函数的声明一般出现在函数的使用之前,要满足先声明后使用。
3、函数的声明一般要放在头文件中。
函数定义:
函数的定义是指函数的具体实现,交代函数的功能实现。

#include<stdio.h>
//函数声明
int Add(int x,int y);
int main()
{
int a=10;
int b=39;
int sum=0;
//函数调用
sum=Add(a,b);
printf("%d\n",sum);
return 0;
}
//函数定义
int Add(int x,int y)
{
int z=x+y;
return z;
}