C语言学习4

C语言笔记4

第七课 class 7

函数

除main函数其他都能调用

int(返回值类型) max(函数名) (参数){

​ 函数体

}

void表示没有返回值(无return)

省略默认为int

参数不可为常量、表达式、数组元素

定义函数:在参数后直接加;

函数体内不能定义函数

函数返回值以函数类型为准

函数调用的参数和参数单元不是同一地址,只传递值,不改变原值

1
2
3
4
5
6
7
8
9
10
11
12
int swap(int x,int y){
int t;
t=x;x=y;y=t;
}

int main(){
int a,b;
a=2;b=3;
swap(a,b);
printf("%d %d",a,b);
}
//out:2 3

函数放后面需要在main前定义

当数组名作为函数参数,类型必须相同;传递的为数组第一位地址,改变时改变原值

f(int b[10]) /f(int b[]) /f(int *b) (二维数组只有第一个可省)

sizeof(s1)/sizeof(int)=数组s1长度

递归

一定要有终止递归的条件

1
2
3
4
long fact(int n){
if (n==1)return 1;
else return(n*fact(n-1));
}

局部变量

函数内部定义的变量

大作用下的a在内部定义的a中被屏蔽

extern:引用外部变量

储存类别:auto,(static,extern)-静态,不会被释放掉(出局域也不消失)(不赋值,则0,空字符)

extern调用不同源文件的函数需要提前定义:extern 函数类型 函数名(参数)

1
2
3
4
5
6
7
8
9
10
11
12
13
int a,b;
extern int max() ;
void main() {
a=1;b=2;
printf("%d",max(a,b));
return 0;
}

//另一个文件:
extern int a,b;
int max(){
return(a>b?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
2
3
4
5
struct note
{
int data; //可以有不同类型
struct note *next; //指针变量成员只能是1个*
};

其中有头指针和尾指针(null)

申请动态内存空间:malloc

1
(struct note *)malloc(sizeof(struct note));

建立

1
2
struct note *p,*p1,*head; //head为头指针
p1->next;
1
2
3
4
5
6
7
struct node
{
int data;
struct node *next;
};
struct node *p,*p1,*head;
head=p1=p=(struct node *)malloc(sizeof(struct node));

产生第二个节点:

1
2
3
4
scanf("%d",&p->data);
p=(struct node *)malloc(sizeof(struct node));
//连接一二两个节点:
p1->next=p;

产生第三节点:

1
2
3
p1=p; //p1指向了第二个节点
scanf("%d",&p->data);
p=(struct node *)malloc(sizeof(struct node));

结束:

1
p->next=NULL;

合并:(5个数的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct node{
int data;
struct node *next;
};

int main(int argc, char *argv[]) {
struct node *p,*p1,*head;
head=p1=p=(struct node *)malloc(sizeof(struct node));
p1->data=1;
for(int i=1;i<5;i++) {
p=(struct node *)malloc(sizeof(struct node));
p1->next=p;
p1=p;
p1->data=i;
}

p1->next=NULL;

return 0;
}

打印

1
2
3
4
5
6
7
p=head; //从头开始打
while (p->next!=NULL){
printf("%d",p->data);
p=p->next; //找到下一个
}
printf("%d\n",p->data);
//out:1 2 3 4 5

修改

1
2
3
4
5
6
7
8
9
p=head;//回到开头
for (int i=0;i<2;i++){ //数2个到第三位
p=p->next;
}
for(int i=0;i<3;i++){ //从第三开始data+1
p->data+=1;
p=p->next;
}
//out:1 2 4 5 6

删除

猴子选大王问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#define N 11
typedef struct node
{
int date;
struct node *next;
}node;

int main(){
node *p,*p1,*head,*del;
int num=N;
int count=0;
head=p=p1=(node *)malloc(sizeof(node));
p1->date =1;
for(int i=2;i<=N;i++){
p=(node *)malloc(sizeof(node));
p1->next = p;
p1=p;
p1->date=i;
}
p->next=head;

p1=p=head;

while(num!=1){
count++;
if(count==3)
{
del=p;
p1->next = p->next;
p=p->next;
printf("%d\n",del->date);
free(del);
num--;
count=0;
}
else{
p1=p;
p=p->next;
}
//p=p->next;
}

printf("%d",p->date);

插入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
p=head;
for(int i=0;i<2;i++){
p=p->next;
}

for(int i=0;i<3;i++){
p->date+=1;
p=p->next;
}

p1=head;
p1=p1->next;
p=(node *)malloc(sizeof(node));
p->date=3;
p->next=p1->next;
p1->next=p;