- 本文对应鹏哥c语言初识C语言的函数后部分
- 函数的参数
- 实际参数:常量变量表达式函数,真实传给函数的值
- 形参:函数名括号中的变量,形参在函数调用完就自动销毁,局部变量。
- 形参实例化之后相当于实参的一份临时拷贝,形参拥有自己的空间
- 传值调用
形参和实参占用不同的内存块,对形参的修改不会改变实参
- 传址调用
把函数外部创建变量的内存地址传给函数参数
void add(*p)
{
*p++;
}
int main()
{
add(&num);
}
- 练习
函数判断是不是素数 #include <stdio.h> int prime(int x) { int flag = 0; int a = 0; for (a = 2; a < x; a++) { if (x % a == 0) { flag = 1; break; } } return flag; } int main() { int i = 0; int a = 0; for (i = 100; i <= 200; i++) { if (prime(i) == 0) printf("%d\n", i); } return 0; }
闰年 //能被400整除 //能被4但是不能被100整除 #include <stdio.h> int year(int x) { int flag = 0; if(((x % 4 == 0 )&& (x % 100!=0))||(x % 400 == 0)) { flag = 1; } return flag; } int main() { int i = 0; for (i = 1000; i <= 2000; i++) { if (year(i) == 1) printf("%d ", i); } return 0; }
整形有序数组二分查找 #include <stdio.h> int search(int arr[],int k,int sz) { int left = 0; int right = sz - 1; int mid = left +( right-left) / 2; while (left<=right) { if (arr[left] < k) { left = mid + 1; } else if(arr[mid]>k) { right = mid - 1; } else { return mid; } } return -1; } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7}; int k; k = 7; int sz = 0; sz = sizeof(arr) / sizeof(arr[0]); int a = 0; a=search(arr, k,sz); if (a == -1) { printf("找不到"); } else { printf("下标是%d", a); } return 0; }
形参不能用sizeof计算数组大小,数组传参实际上传递了数组首元素的地址,arr实际上是指针变量
-
c99引入bool类型 #include <stdbool.h>真假
bool is_prime (int n) 真假false true
- 函数嵌套
可以嵌套调用,但是不能嵌套定义
- 函数声明
#include “add.h"
- 函数递归
存在限制条件,满足这个限制条件递归不再继续,递归调用之后越来越接近限制条件
接受一个整型值,按顺序打印每一位
#include <stdio.h>
//%u是打印无符号的整数
void print(unsigned int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0;
scanf("%u", &num);
print(num);
return 0;
}
栈溢出
栈区 局部变量 返回值 函数的形参 每一次函数调用都会都会在栈区申请空间
堆区 动态内存分配 malloe free calloc realloc
静态区 静态变量 全局变量
- 作业
//N的阶乘
#include <stdio.h>
//%u是打印无符号的整数
int fac( int n)
{
if (n <= 1)
return 1;
else
return n * fac(n - 1);
}
int main()
{
int num = 0;
int res = 0;
scanf("%d", &num);
res=fac(num);
printf("%d",res);
return 0;
}
if (i=5)是赋值,不是判断
char 属于整形家族,ascii码
switch后面必须是整形,int,long char
case如果没有Break继续执行
void swap(int*px,int*py)
{
int tmp=*px;
*px=*py;
*py=tmp;
}
swap(&a,&b);
//求最大公约数
int main()
{
int a= 0;
int b= 0;
scanf("%d %d", &a,&b);
//辗转相除法
while (a % b)
{
int c = a % b;
a = b;
b = c;
}
printf("%d",b);
return 0;
}
最小公倍数a*b/最大公约数
for循环 continue回到调整语句a++
int main()
{
int a= 0;
int b= 0;
scanf("%d %d", &a,&b);
//辗转相除法
while (a % b)
{
int c = a % b;
a = b;
b = c;
}
printf("%d",b);
return 0;
}
%-2d左对齐
函数设计应该追求高内聚低耦合
设计函数的时候尽量做到谁申请的资源就由谁释放
在不同函数里可以使用相同名字的变量
函数调用传递两个参数,指针,数组,全局变量,不能用return返回两个值