函数
形参实例化后就相当于实参的一份临时拷贝。
内存分为:栈区、堆区、静态区。
栈区储存:局部变量、形式参数。
堆区(动态内存管理)储存:malloc,realloc,calloc。free函数。
静态区存储:静态变量、全局变量。
int a=0;
a是给程序员自己看的。机器看内存是直接看地址的。
函数的调用
传值调用:比大小。
在这种设计中,形参是实参的一份临时拷贝,对形参的修改不会影响实参。
形参和实参分别占用不同的内存块。
传址调用:交换数据。
传递变量的地址,通过形参的指针就能访问到函数外部的变量,并进行操作。
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外面的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
int *pa:创建一个指针变量。&a:传地址进去,pa即存放a的地址,*pa即对pa地址所指向的a进行操作。
用函数找素数(使用math头文件和sqrt函数)
//判断100--200中素数和其个数。
//先假设有这个函数,在主函数把主体写好,这时你的函数返回值类型等都能确定,完善好主体后再去写你用的函数。去实现这个函数。
TDD-----测试驱动开发(test drive development )
#include <stdio.h>
#include <math.h>
int is_prime(int x)
{
for (int j = 2; j <= sqrt(x); j++)
{
if ((x % j) == 0)
{
return 0; break;
}
}
return 1;
}
int main()
{
int count = 0;
for (int i = 100; i <= 200; i++)
{
if ((is_prime(i))== 1)
{
printf("%d ", i);
count++;
}
}
printf("%d", count);
}
函数的定义
函数:子程序。
是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务。并相对于其他代码,具有相对的独立性。
一般会有输入参数并有返回值,提供对过程的封装和对细节的隐藏。这些代码通常被集成为软件库。
函数可以嵌套调用,但是不能嵌套定义。
函数的链式访问
把一个函数的返回值作为另外一个函数的参数。
int ret=strlen(strcat(arr,"bit")),strcat函数把arr后面接上bit的字符串,之后再计算其长度。
函数的声明和定义
函数的声明需要;
函数的定义不需要
函数的声明放在头文件中。
如果有子程序1,函数在子程序2中,则要在子程序1用头文件包含以下。
#include “add.h” //add是函数名。
.lib 静态库
函数的递归
死递归会导致栈溢出。
递归是函数自己调用了自己。
函数栈帧的创建与销毁。
每一次函数的调用,都要在栈区分配一块内存空c函数在调用过程中的中下文信息。
每次调用都会分配一个空间,等归的时候逆序销毁。
递归函数:我自己调用我自己。我内部的函数包含我自己。如果变成死递归,栈空间最后会溢出,死掉了就。
递归成功条件:
我递归过程中得不断去逼近我的判断条件(否则会造成死递归)
(1)存在限制条件,当满足这个限制条件时,递归就不再发生。
(2)每次递归调用之后会越来越逼近这个条件。
递归中排队顺序打印
n=1234
打印: 1 2 3 4.
#include <stdio.h>
void print(unsigned int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d\n",n%10);
}
int main()
{
int a = 0;
scanf("%d", &a);
print(a);
return 0;
}
strlen函数的构造
#include <stdio.h>
int strlen(char*s)
{
int count = 0;
while(*s != '\0')
{
count++;
s++;
}
return count;
}
int main()
{
char arr[] = "abcdefg";
int num = strlen(arr);
printf("%d", num);
return 0;
}
使用递归写strlen函数
//用函数递归来写strlen函数,不要用局部变量。
int strlen(char*s)
{
if (*s == '\0')
{
return 0;
}
else
return 1 + strlen(s + 1);
}
int main()
{
char arr[] = "abcdefg";
int num = strlen(arr);
printf("%d", num);
return 0;
}
迭代求阶乘
#define _CRT_SECURE_NO_WARNINGS 1
//迭代求阶乘
#include <stdio.h>
int Fac(int input)
{
if (input == 1)
return 1;
else
return input * Fac(input - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int num = Fac(n);
printf("%d", num);
return 0;
}