C语言中函数的分类
1.库函数
2.自定义函数
库函数
那怎么学习库函数呢?
简单看看:www.cplusplus.com
简单的总结,C语言常用的库函数都有:
IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数
注:
但是库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。这里对照文档来学习上面几个库函数,目的是掌握库函数的使用方法。
如何学会使用库函数?
需要学会查询工具的使用:
MSDN(Microsoft Developer Network)
www.cplusplus.com
http://en.cppreference.com(英文版)
http://zh.cppreference.com(中文版)
自定义函数
自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
#include <stdio.h>
//get_max函数的设计
int get_max(int x, int y)
{
return (x>y)?(x):(y);
}
int main()
{
int num1 = 10;
int num2 = 20;
int max = get_max(num1, num2);
printf("max = %d\n", max);
return 0;
}
//形式参数
void Swap(int x,int y)
{
int z=0;
z=x;
x=y;
y=z;
}
//这个函数并不会改变a,b的值
//当实参传递给形参的时候,形参是实参的一份临时拷贝
//对形参的修改不会影响实参
//正确版本
void Swap2(int *px, int *py)
{
int z = 0;
z= *px;//z=a
*px = *py;//a=b
*py = tmp;//b=z
int main()
{
int a=0;
int b=0;
scanf("%d%d,&a,&b);
printf("交换前:a=%d b=%d\n",a,b);
printf("交换后:a=%d b=%d\n",a,b);
Swap(a,b);
printf("交换后:a=%d b=%d\n",a,b);
return 0;
}
函数是什么?
一、函数定义的基本格式:
返回值类型 函数名(形参变量)
{
函数体:
}
1.返回值类型:常用基本数据类型,函数执行完之后,函数会得到一个什么类型的值。
如果需要返回一个值出去,那么返回值类型这里,通过return把值返回出去
如果不需要返回一个值出去,那么就在返回值类型这里就用void
eg.
int main() 主函数main函数,程序的入口
{
return 0; 话说完了,函数运行程序结束了
}
2.函数名:就是一个标识符,符合规则和规范
3.程序的运行流程:从上往下运行,程序的入口在main函数
函数的参数
实际参数
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内
存单
元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
函数的调用
传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
调用函数的时候会把实参传给形参,对应位置进行传参(值传递)
传址调用
1.传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
2.这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
变量
7.1局部变量:作用域在一定的区域内才能被使用的变量,出了自己的作用域就会被释放
7.2全局变量:从定义开始往下,所有的地方都可以使用,在程序结束时被释放
注:全局变量和局部变量允许同名,使用这个同名变量时,使用的是最近的一个,即就近原则,同时,如果没有给全局变量赋值,那么系统自动默认为0
7.3静态变量:在程序执行后定义,生命周期是程序结束后才死亡,只会被定义一次,不会被重复定义
8.代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放(静态:static)堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。
eg.
int main()
for(int i=0;i<10:i++)
{
static int a=10;
//静态变量和全局变量存在静态全局区
a++;
printf("d\n",a);
}
//此时输出a的值为11,12,13……20
int main()
for(int i=0;i<10:i++)
{
int a=10; //局部变量存在栈区
a++;
printf("d\n",a);
}
//此时输出a的值11,11,11……11
函数的声明与定义
函数声明
1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。
2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3. 函数的声明一般要放在头文件中的。
函数定义
函数的定义是指函数的具体实现,交待函数的功能实现
10.地址:在定义变量,数组,函数等等,系统会给它们内存区域(地址),把这个数据放到这个地址上面
&:&a 获取a的地址编号
*:定义指针变量的标志
指针变量:存储地址的变量
整型变量:存储整数的变量
*:解引用,取内容
址传递能通过形参改变实参的值
eg.
void fun1(int*p1)
{
printf("%d\n",*p1);
*p1=1000;
}
int main()
{
int x=100;
fun1(&x);
printf("%d",x);
return 0;
}
此时输出*p1为100,x为1000
函数的递归
什么是递归?
程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接
调用自身的
一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,
递归策略
只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小
递归的两个必要条件
存在限制条件,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件。
eg.
递归逆向输出一个数
void fun3(int n)
{
if(n!=0)
{
printf("%d",n%10);
fun3(n/=10);
}
}
int main()
{
fun3(1234);
}
c此时输出为4321
//斐波那契数列 1 1 2 3 5 8 13…… 第n个元素的值=第n-1个元素的值+第n-2个元素
#include <stdio.h>
int fun4(int n)
{
if(n==1||n==2)
{
return 1;
}
else
{
return fun(n-1)+fun(n-2);
}
}
int main()
{
int n;
printf("请输入要求的斐波那契数列项数:");
scanf("%d", &n);
printf("第%d项斐波那契数列的值为:%d\n", n, fun(n));
}
接受一个整型值(无符号),按照顺序打印它的每一位。
例如:
输入:1234,输出 1 2 3 4
#include <stdio.h>
void print(int n)
{
if(n>9)
{
print(n/10);
}
printf("%d ", n%10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
#include <stdio.h>
// 递归函数,用于计算阶乘
int factorial(int n)
{
if (n == 0)
{
return 1;
}
return n * factorial(n - 1);
}
int main() {
int num;
printf("请输入一个整数: ");
scanf("%d", &num);
// 调用factorial函数计算阶乘并输出结果
printf("%d的阶乘是: %d\n", num, factorial(num));
return 0;
}
递归与迭代
int Fib(int b)
{
int a=1;
int b=1;
int c=0;
while(n>=3)
{
c=a+b;
a=b;
b=c;
n--;
}
}
int main()
{
int n=0;
scanf("%d",&n);
int ret=Fib(n);
printf("%d\n",ret);
return 0;
}
标签:return,函数,--,笔记,C语言,int,printf,main,库函数
From: https://blog.csdn.net/kangll_/article/details/144143452