C语言笔记4
第七课 class 7
函数
除main函数其他都能调用
int(返回值类型) max(函数名) (参数){
函数体
}
void表示没有返回值(无return)
省略默认为int
参数不可为常量、表达式、数组元素
定义函数:在参数后直接加;
函数体内不能定义函数
函数返回值以函数类型为准
函数调用的参数和参数单元不是同一地址,只传递值,不改变原值
1 | int swap(int x,int y){ |
函数放后面需要在main前定义
当数组名作为函数参数,类型必须相同;传递的为数组第一位地址,改变时改变原值
f(int b[10]) /f(int b[]) /f(int *b) (二维数组只有第一个可省)
sizeof(s1)/sizeof(int)=数组s1长度
递归
一定要有终止递归的条件
1 | long fact(int n){ |
局部变量
函数内部定义的变量
大作用下的a在内部定义的a中被屏蔽
extern:引用外部变量
储存类别:auto,(static,extern)-静态,不会被释放掉(出局域也不消失)(不赋值,则0,空字符)
extern调用不同源文件的函数需要提前定义:extern 函数类型 函数名(参数)
1 | int a,b; |
在vscode需要加:gcc f1.c f2.c -o f.exe将两个文件放一起
第八课 class 8
指针
赋值
指针:数据存储的内存的地址
指针变量:存放地址的变量
int i=10,*p; 指针变量只存最后的变量,本身没有数据类型
p=& 此时p指向i,p是指针变量
int *p1 指向整型变量的指针变量
char *p2 指向自负变量的指针变量
int *ip=&i 不能分开定义
int *p;
p=&i;
int *pn=&i;
*ip=pn;
未赋值时指针变量是空地址(null)
指针变量的类型必须和所指的变量类型相同
“&”和“*”为互逆值 *(&i)=i
p=&1; p2=&a[4]
不能对常量和表达式进行&运算
不行:
p1=&68
p=&(1+8)
运算
只有在数组中时指针的加减才有意义
p=a等效于p=&a[0]
两地址相减可表示两者之间的位置差(得出结果是指针偏移量相减,不是直接地址相减)
可判断大小:在数组中的位置前后
两个指针变量相加没有意义
数组名作为函数参数
int *pc;
pc=”hello”;
将首字母h的地址给pc
char *week[7]={}
运用指针数组
p[2] (p为指针,意思为p向后两个的地址)
指向指针的指针
**p
第九课 class9
结构体
允许有不同的数据类型(可以有数组)
struct 结构体名
{类型说明符 成员名1;
类型说明符 成员名2;
};
struct 结构体名
{类型说明符 成员名1;
类型说明符 成员名2;
};变量1,变量2
里面成员与定义变量相同
同一结构体内不能重名,不同结构体可以,可以和程序变量重名
结构体变量
使其在内存空间中实体化
struct student stu1,stu2;(使用)
存放:使用最低结构体内存在的最大大小(如int是4)的整数倍数
定义时一般小定义在上门
结构体初始化
struct 结构体名
{类型说明符 成员名1;
类型说明符 成员名2;
};变量={};
大括号里内容与成员名一致
不可跳过,可只给前面若干成员赋值
引用
结构体变量名.成员名(“.”为“的”)
输入:不能整体操作,必须逐个取值
结构体内变量与普通变量使用一致
若干变量可互相赋值
结构数组
将结构变量放入数组
定义:struct student stu[3]
引用:stu[0].name … …
姓名,学号,三科成绩,求平均成绩,按平均值从高到低排序
输入,求平均值,排序,输出
链表
由指针和数据组成一个节点
1 | struct note |
其中有头指针和尾指针(null)
申请动态内存空间:malloc
1 | (struct note *)malloc(sizeof(struct note)); |
建立
1 | struct note *p,*p1,*head; //head为头指针 |
1 | struct node |
产生第二个节点:
1 | scanf("%d",&p->data); |
产生第三节点:
1 | p1=p; //p1指向了第二个节点 |
结束:
1 | p->next=NULL; |
合并:(5个数的)
1 | struct node{ |
打印
1 | p=head; //从头开始打 |
修改
1 | p=head;//回到开头 |
删除
猴子选大王问题
1 |
|
插入
1 | p=head; |