1.结构体实质
结构体可以理解为一种自定义的数据类型。需要定义这个数据类型内部的若干个模板结构(需要自己定义,定义全局变量或在函数内定义,但多个函数时一般定义全局变量),其内部的模板结构需要有明确的数据类型(int double等)。例如定义一个全局变量结构体:
#include <stdio.h>
#include <stdlib.h>
struct date
{
int y,m,d;
};
注意定义结构体之后要有分号,因为这是一个语句。
struct date其实是一个你定义的数据类型,相当于int或者double 诸如此类。
有时候嫌写struct date 太麻烦,可以这样为结构体数据类型取一个名字:
(但是记住,为结构体数据类型取名的时候要加 typedef)
#include <stdio.h>
#include <stdlib.h>
typedef struct date
{
int y,m,d;
}name;
此struct date数据类型就可以用name表示。
相当于,如果要定义一个struct date x,就可以直接用name x表示
2.结构体变量(难点是指针型变量)
在定义一个结构体类型后,要使用这个结构体需要定义一个或多个结构体变量,相当于int a里面的a。
定义方法为,struct date a,若已经为结构体数据类型取了名字,则可表示为name a。
可以定义多个结构体变量,每个结构体内部的结构都是相同的,即你自己定义了的内部模板结构。
可以用指针定义结构体变量,他们的关系是平行的,可以看作不同的表单。
要注意使用指针型结构体变量的时候,(.)和(->)的使用问题,详见最下方重点。。。
3.结构体指针
当存在多个函数时,分函数里用到结构体,需要返回运算结果时候有两种方法(因为形式参数的改变不会引起主函数参数改变,若需要主函数参数也随之变化则要运用特殊方法)。
第一是,结构体指针。
引入两个符号:. 和 ->
. 符号是成员运算符,使用此符可以通过使用 结构体变量.结构体内部结构模板的具体区块的形式访问结构体内部结构模板的某一个你自己定义的小区块,例如
typedef struct {
int x;
int y;
}name;
int main(){
name w;
w.x=1;
w.y=2;
}
此处通过定义一个w变量,此时w变量内部就有了int类型的x和int类型的y这两个结构,借 . 访问x或y,改变w.x或w.y的值。
(有且仅能使用这个方法访问结构体内部小结构)
难点是结构体指针
首先要知道
*(a).b 等价于 a->b
在我们使用分函数的时候,要改变原函数变量的值可以将原变量的地址作为形式参数传递给分函数,再通过访问此地址来进行形式参数的编辑,从而达到改变原函数的变量的作用。
#include <stdio.h>
struct Time
{
int hour;
};
void input(struct Time *t)//意思是t是一个结构体指针,即传过来的tt的地址用t表示
{
scanf("%d",&t->hour);//也可写为scanf("%d",&(*t).hour)
}
int main()
{
struct Time tt={5};
input(&tt);//给分函数的形式参数是地址
}
第二是,结构体函数返回值。
重点是记住结构体函数返回值是结构体。
具体例子
输入至EOF结束,输出数入日期中最晚的日期
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
struct date
{
int y,m,d;
};
struct date get_maxdate()
{
struct date d;
int year=0,mon=0,day=0;
while(scanf("%d-%d-%d",&d.y,&d.m,&d.d) != EOF)
{
if(d.y < year)
{
d.y=year;
d.m=mon;
d.d=day;
}
if(d.y == year && d.m < mon)
{
d.m=mon;
d.d=day;
}
if(d.y == year && d.m == mon && d.d < day)
{
d.d=day;
}
year=d.y;
mon=d.m;
day=d.d;
}
return d;//此处是返回值重点
};
int main()
{
struct date d;
d = get_maxdate();//返回值的运用
printf("%04d-%02d-%02d\n", d.y, d.m, d.d);
}
重点:什么时候用(.),什么时候用(->)
当**结构体是一个指针(准确的说是一个地址)**要访问成员的时候用 ->
其他情况用 .