1.使用文档学习库函数
https://cplusplus.com/reference/
https://en.cppreference.com/(英文版)
https://zh.cppreference.com/(中文版)
从以上网址找到要学的库函数
文档中有:函数名、函数原型、详细介绍、形式参数、返回值、例子、相关的其他函数
2.自定义函数
a和b是实际参数,x和y是形式参数,实际参数传给形式参数时,形参是实参的一份临时拷贝,数据传过来了,但是形参有自己独立的空间,也就是说,形参和实参有相同的数据,但是存放地址不同,所以修改形参不会影响实参。
//写一个函数,可以交换两个整形变量的内容
//错误写法
#include <stdio.h>
void Swap(int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
//z是一个空瓶子,x倒进z,y倒进x,z倒进y
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
//交换
printf("交换前:a=%d b=%d\n", a, b);
Swap(a, b);
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
//正确写法
#include <stdio.h>
void Swap(int *px, int *py)
{
int z = *px;
*px = *py;
*py = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
//交换
printf("交换前:a=%d b=%d\n", a, b);
Swap(&a, &b);
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
3.什么时候需要传地址,什么时候不需要传地址(此接上一条)
例如add函数就不需要传地址,因为数据传过去只是单纯相加,不对传过去的数据进行修改,而swap函数不仅需要得到数据还需要修改数据。
4.一个工程中可以有多个.c文件,但是只能有一个main函数,因为main函数是程序的入口。
5.函数拒绝接收参数
#include<stdio.h>
void test(void)//明确拒绝100
{
printf("hehe\n");
}
int main()
{
test(100);
return 0;
}
6.main函数有三个参数(后续再学)
7.把定义的函数(Add)放到后面时,代码虽然可以运行。但是编译器会出现“Add”未定义的警告
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//加法
int sum = Add(a, b);
printf("%d\n", sum);
return 0;
}
int Add(int x, int y)
{
return x + y;
}
8.如果想要把函数定义在后面,就需要在前面对函数进行声明,声明函数的返回类型、名称、参数的类型、个数,参数名称可加可不加,但是函数定义才真正决定函数是否存在
//函数的声明
int Add(int, int);
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//加法
int sum = Add(a, b);
printf("%d\n", sum);
return 0;
}
//函数的定义
int Add(int x, int y)
{
return x + y;
}
//以上在现实中不这样写
9.函数的声明一般要放在头文件中。
在“头文件”中创建“add.h”,在“源文件”中创建“add.c”,这两个称为一个加法模块
进行函数声明即可使用Add函数
一个工程分成多个.h和.c文件,实现模块化,便于协作。
(注意:自己定义的头文件用“”,自带的头文件用<>,他俩的区别后续学)
10.如何将自定义的函数编译成静态库(将“add.c”编译成静态库,变成二进制,不再是代码)
首先新建一个工程,命名为“add”,添加“add.c”和“add.h”。(如果是编写好直接拷贝进去,右击“头文件”和“源文件”)
然后运行,会报错(没关系),在add文件夹中会找到add.lib的文件,该文件就是编译出来的静态库,.pdb文件就是这个静态库的编译文件。
出于对代码的保护,这样别人就无法得知自定义的函数是如何实现的,如果想使用,需要将静态库添加到所需工程文件存放路径下(通俗来说跟源文件一个目录),再将头文件添加到工程中,以及写一行代码,如下图所示
11.每一次函数的调用都会在栈区上申请空间;
stack overflow:栈溢出
12.作业小tips
(1)if语句中,0表示假,非0表示真
(2)switch语句中default字句可以放到任意位置;
switch语句中case字句不要求顺序;
char也是整型家族的,因为字符存储的时候,存储的是ASCII值;
(3)return没有办法一下返回两个值
//这个写法只能返回一个值——4
#include<stdio.h>
int test()
{
return(3, 4);//加不加括号都是一个逗号表达式
}
int main()
{
int ret = test();
printf("%d\n", ret);
return 0;
}