c复习day05

函数的概念

1.函数及作用

  • 将原来在main中的代码换一个位置,存放在另一个地方
  • 为了减少重复的代码块,有了利于阅读
  • 代码的模块清晰,存代码块的地方就是函数
1
2
3
4
5
//函数的定义
返回类型 函数名(参数)
{
函数体;
}
  • 理论上函数可以任意起名字,但是最好见明之意思
  • 形参不能赋值
  • 在定义函数的时候必须是类型+变量的形式,如果不写类型可能默认是int
  • return的返回值 要与函数定义的相匹配
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
void fun()
{
printf("hello fun\n");
return;
}
int main()
{
printf("hello main\n");
fun();
return 0;
}
  • 函数的定义不能定义在函数的代码块,必须在函数的外面

  • 函数加()代表这是一个函数,如果返回值没有需要写void,而参数则可以写空格

  • {}里面是函数体,所有的代码必须放在{}中

  • 函数调用:函数名+();

有参数无返回值的调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
void fun(int a,int b)
{
int c = 0;
c = a + b;
printf("%d\n");
return;
}
int main()
{
int x = 34;
int y = 32;
fun(x,y);
return 0;
}
  • 函数定义时()里面的参数叫形参,因为形参只是形式上的参数,定义函数时没有开辟空间
  • 形参只有在被调用的时候才会分配空间
  • 形参的定义 类型名 + 变量名
  • 函数调用有参函数时候,不可以没有参数
  • 调用函数时候()中的参数叫做实参
  • 实参的类型和形参数的类型,个数 必须一致
  • 实参数可以为变量 也可以为表达式 只要类型相同就可以

有参有返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int fun(int a,int b)
{
return a+b;
}
int main()
{
int x = 10;
int y = 343;
int z = fun(x,y);
printf("%d\n",z);
printf("%d\n",fun(x,y));
return 0;
}
  • 调用有返回值的函数时,可以接也可以不接
  • 注意:因为返回的类型是int ,所以接受返回值的变量也是int(相同)
  • 参数 的传递只能是单向,实参->形参
  • 返回值小于4字节,存在寄存器中
  • 如果大于4字节,放在内存中
  • 在传递的过程中本质上来说是传递值

实参转递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
void swap(int x,int y)
{
int i = 0;
i = x;
x = y;
y = i;
return;
}
int main()
{
int a = 10;
int b = 20;
swap(a,b);
printf("a = %d,b = %d\n",a,b);
return 0;
}
  • 实参传给形参,形参的值不会改变实参的值
  • 如果参数是传变量,只会是值传递

函数的声名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int fun(int a,int b);
int main()
{
int x = 10;
int y = 343;
int z = fun(x,y);
printf("%d\n",z);
printf("%d\n",fun(x,y));
return 0;
}
int fun(int a,int b)
{
return a+b;
}
  • 声明:把函数的定义形式放在调用之前,声明不许要写函数体,需要加分号,也可以放在函数体中
  • extern:用来声明,不加也可以
  • 在声名中不写变量名也可以,只需要指定参数类型即可
  • 作用:告诉编译器,这个函数在其他地方定义
  • 区别:定义有函数体没分号,声明没有函数体

return和exit的区别

  • return :结束当前的函数
  • 如果return在子函数中调用,只会结束子函数,如果return在main函数中会结束整个程序
  • exit: 是一个库函数,用来结束整个程序,不管exit在哪里调用都会结束程序:exit (0);

分文件

1
2
3
4
5
6
7
8
9
10
11
//main.c
#include <stdio.h>
#include "my.h"
int main()
{
int a = 10;
int b = 20;
printf("max = %d\n",mymax(a,b));
printf("sum = %d\n",mysum(a,b));

}
1
2
3
4
5
6
7
8
9
10
11
12
13
//my.c
int mymax(int a,int b)
{
return a > b ? a : b;
}
int mymin(int a,int b)
{
return a < b ? a : b;
}
int mysum(int a,int b)
{
return a + b;
}
1
2
3
4
//my.h
int mymax(int a,int b);
int mymin(int a,int b);
int mysum(int a,int b);
  • 需要注意的一点是防止头文件重复包含
  • 头文件中,只声名,不定义
  • 定义只在.c文件中

防止头文件重复包含

1
2
3
4
5
6
7
//my.h
#ifndef MY
#define MY
int mymax(int a,int b);
int mymin(int a,int b);
int mysum(int a,int b);
#endif
  • 宏的名字最好和文件名相同,大写
  • 在vs中我们也可以使用#prama once
你的支持是我最大的动力!
0%