Autoleaders控制组 李鋆 ——结构体 学习笔记
一.11.2-1 结构类型
1.声明结构
- 结构体要写成这个样子呐
struct date
{int month;
int day;
int year;
};
//新手常常忘记最后的这个分号//
- 根本地变量一样,在函数内部声明的结构类型只能在函数的内部使用
- 所以我们常常在外部声明结构类型
像是下面这个样子
#include <stdio.h>
struct date
{int month;
int day;
int year;
};
//这里的结构类型就没有再main函数里面声明,在任意的地方都可以进行//
int main(int argc, char const*argv[])
{
struct date today;
today.month=07;
today.day=31;
today.year=2022;
printf("Today's date is %i-%i-%i.\n",
today.year,today.month,today.day);
return 0;
}
2.声明结构的形式
- 最常用的是以下结构声明形式
struct point {
int x;
int y;
} p1,p2;
//p1跟p2都是point里面有x和y的值t//
3.结构的初始化
可以这样
struct date today={07,31,2022};
也可以这样
struct date thismonth={.month=7,.year=2022,day=31};
4.结构成员
结构用.运算符和名字访问其成员
像是
- today.day
- student.first name
- p1.x
- p2.y
5.结构运算
-
要访问整个结构的话,直接用结构的名字就好了
-
对于整个结构,可以赋值 取地址,也可以传递给函数参数
像是 p1=(struct point){5,10};//相当于pl.x=5; pl.y=10;
二.11.2-2 结构与函数
1.结构作为函数参数
int numberofdays(struct date d)
- 整个结构可以作为参数的值传入函数
- 这时候是在函数内新建一个结构变量,并赋值调用者的结构的值
- 也可以返回一个结构
2.输入结构
- 如果我们打算写一个函数来读入这个结构,我们要用 -> 这个运算符来进行读入
- 但是读入的结构又要如何传回来呢?
- 记住在C语言中函数的调用是传值的
//可以尝试用以下代码来进行函数中结构的输入/
#include <stdio.h>
struct point {int x; int y;
};
void getstruct(struct point );
void output(struct point );
void main()
{
struct point y={0,0};
getstruct(y);
output(y);
}
void getstruct(struct point p)
{
scanf("%d",&p.x);
scanf("%d",&p.y);
printf("%d %d",p.x,p.y);
}
void output(struct point p)
{
scanf("%d",&p.x);
scanf("%d",&p.y);
printf("%d %d",p.x,p.y);
}
3.结构指针作为参数
在进行结构的传输时更好的方式是利用指针传输而不是将整个结构进行传输
4.指向结构的指针
- 用-》表示指针所指向的结构变量中的成员
//就像是下面这样//
struct date{int day ;int month ;int year;
}myday;
struct date *p=&myday;
(*p).month=12;
p->month=12;
三.11.2-3 结构中的结构
1.结构数组
形如
struct date dates[100];
struct date dates[]={
{4,5,2022
},
{2,4,2055
}
};
2.结构中的结构
像是
struct dateandtimee{
struct daate sdate;
struct time stime;
};
3.嵌套的结构
像是这样
struct point {
int x;
int y;
};
struct rectangle{
struct point pt1;
struct point pt2;
};
4.结构中的结构的数组
这样子对数组进遍历,多是一件美式
#include <stdio.h>
struct point{
int x;
int y;
};
struct rectangle{
struct pint pl;
struct point p2;
};
void printrect(struct rectangle r)
{
printf("<%d,%d>to<%d,%d>\n",r.pl.x,r.pl.y,,r.p2xr.p2.y);
}
int main (int argc,char const*argv[])
{
int i;
struct rectangle rects[]={{{1,2
},{3,3}
},{{5,6},
{7,8
}}
};
for (i=0;i<2;i++)
printfrecct(rects[i]);
}