1.C语言中函数的分类
1.库函数
库函数学习网址:www.cplusplus.com
C语言常见的库函数
IO函数:printf scanf getchar putchar
字符串操作函数:strcmp strlen
字符操作函数:toupper
内存操作函数:memcpt memcmp memset
时间/日期函数:time
数字函数:sqrt pow
其他库函数
//strcpy函数
int main()
{
char arr1[20] = { 0 };
char arr2[] = "hello world";
strcpy(arr1, arr2);//strcpy拷贝 arr1是目的地 arr2是源头
printf("%s\n", arr2);
return 0;
}
//memset函数
int main()
{
char arr[] = "hello world";
memset(arr, 'x', 5);//设置内存块 arr是起始地址 x是设置内容 5是设置几个字节
printf("%s\n", arr);
return 0;
}
2.自定义函数
自定义函数和库函数一样,有函数名,返回类型和函数参数。但不一样的是这些都是自己来设置设计的。这给了程序员一个很大的发挥空间
ret_type fun_name(parra1,*)
{
statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1 函数参数
//例子1:写一个自定义函数,比较两个值的大小
int get_max(int x, int y)
{
int z = 0;
if (x > y)
z = x;
else
z = y;
return z;//返回z-返回较大值
}
int main()
{
int a = 10;
int b = 20;
//函数的调用
int max = get_max(a, b);
printf("%d\n", max);
}
//例子2:写一个自定义函数 -交换2个整型的变量
//函数返回类型的地方写出:viod,表示这个函数不返回任何值,也不需要返回
void swap(int* pa, int* pb)//运用了指针 swap(intx ,int y) 这些也叫形式参数 整个swap函数叫做函数的定义
{
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
int main()
{
int a = 10;
int b = 20;
//写一个哈函数 - 交换2个整形的变量的值
printf("没改之前的:a=%d b =%d\n", a, b);
swap(&a, &b);//函数调用 里面的&a,&b叫做实际参数
printf("改了之后的:a =%d b = %d\n", a, b);
return 0;
}
//不改变a,b可以不改变地址 ,改变了a ,b的值就需要改变地址
实际参数
真实传给函数的参数,叫实参。实参可以是:常量 变量 表达式 函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定值,以便把这些值传给形参
形式参数
形式参数是指函数名后括号中的变量,因为形式只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了,因此形式参数只在函数中有效
2.函数调用
传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参
传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数方式。
这种传参方式可以让函数和函数外边的变量建立真正的联系,也就是函数内部可以直接操作函数外部的变量
练习题
1.写一个函数可以判断100-200有多少素数
int primse(int n)
{
int j = 0;
for (j = 2; j < n; j++)
{
if (0 == n % j)
return 0;
}
return 1;
}
int main()
{
//100-200之间的素数
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
if (primse(i) == 1)
{
count++;
printf("%d", i);
}
printf("\ncount= %d\n", count);
}
return 0;
}
2.写一个函数判断一年是不是闰年
//一个函数如果不写返回类型,默认返回int
int is_leap_year(int n)
{
if (0 == n % 4 && 0 != n % 100)
{
printf("%d\n", n);
return 0;
}
else
{
return 0;
}
}
int main()
{
int y = 0;
for (y = 1000; y <= 2000; y++)
{
if (is_leap_year(y) == 1)
{
printf("%d\n", y);
}
}
return 0;
}
3.写一个函数,实现一个整形有序数组的二分查找
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()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int key = 11;
int sz = sizeof(arr) / sizeof(arr[0]);
//找到了就返回找到的位置的下标
//找不到就返回-1
int ret = binary_search(arr, key,sz);
if (-1 == ret)
{
printf("找不到了");
}
else
{
printf("找到了下标是:%d\n", ret);
}
return 0;
}
4.写一个函数,每调用一次这个函数,就会将num的值增加1
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;
}