文章目录
一.结构类型的声明
1.声明形式
例如:`#include<stdio.h>
struct date {
int year;
int month;
int day;
};`
struct是一个关键字,而大括号中的变量是结构中的成员。
即每一个struct date 类型的变量中都有 year month 和day 这三个成员。
其他形式:`#include<stdio.h>
struct date { struct{
int year; int year;
int month; int month;
int day; int day;
}d1,d2,d3; }d1,d2,d3;
第一和第二种形式都声明了该结构类型的名字date,而第三种没有声明,只是定义了d1,d2,d3三个变量。
2.声明的位置
一般不建议在函数内部声明,因为函数的作用域与函数相类似,若在所有函数之前进行定义声明,则在任意函数内均可使用。
二.结构变量的赋值
1.说明
在声明完某一结构类型之后,可以定义任意多个该类型的结构变量,而每个结构变量均包含此结构类型中的所有,比如上述struct date中的year,month和day。
2.赋值方式
#include<stdio.h>
int main(){
struct date {
int year;
int month;
int day;
};
struct today = {2014,9,26}://第一种
struct thismonth = {.year=2014,.month=9}://第二种
以上第一种定义方式,是依次按声明时的顺序分别给出对应的值并填入;
第二种定义方式则用到了“ . ”运算符,只给其中一或几个值赋值,其他未赋值的初始值为零。
3.写一个函数以进行输入
struct date shuru(){
struct date D;
scanf("%d",&D.year):
scanf("%d",&D.month):
scanf("%d",&D.day):
return D;
//在使用时
struct date Date1 ={0,0,0}:
Date1 = date D();
在此函数中,我们定义了一个新的同类型的结构变量,通过对其进行赋值,并将这个结构变量整体作为函数返回值,即可完成对原结构变量赋值的任务。因为结构变量之间可以直接进行赋值,在三中有详解。
三.结构与数组
结构和数组有一定的相似
数组用[]运算符和下标来对其中成员进行访问,而结构用的是 . 运算符和成员名称来进行访问。
a[0] = 10;
date.today=30;
诸如此类。
四.结构运算
1.结构的访问
1.要访问某个结构,直接用结构变量的名字(并非结构类型的名字)。
2.结构的各种运算
1.结构变量的赋值
date1 = (struct date){2014,9,26};
date2 = date1;
两种赋值方式均可行,而在数组中均不可行。
2.取地址以及做函数参数
a.取地址:
须得用到&运算符,不能像数组那样只用变量名称a 代替&a。
b.做函数参数:
以上述date 为例,做函数参数时形式为:
int hanshu{struct date Date}
整个结构可以作为参数的值传入函数
但此时是在函数内部新建了一个结构变量 并复制了调用者所传入的结构的值。
自然也可以返回一个结构。
五.运算符优先级
scanf("%d %d",&Date.day,&Date.month);
我们知道在scanf语句中,应该是&运算符+一个变量,来进行访问赋值。因此:
&运算符的优先级低于 . 运算符,即上述语句中先进行了Date.day 和 Date.month的运算,再进行了&运算。
六.指向结构的指针
先上代码:
struct point(
int x;
int y;
}crazy;
struct point *p = &crazy;
(*p).x = 1;
p->x = 1;
现在我们有类型名称为point 的叫做crazy的结构变量以及一个指向该变量的指针p。
代码的最后两行是等效的。
要点1.:“ . ”运算符的优先级高于*运算符,故须(*p)加括号。
要点2:即指向结构的指针的特殊的第二种形式。“p所指的结构变量中的成员”
七.结构数组
struct point(
int x;
int y;
}
struct point array[10]=
{{1.2},{3,4}}:
在上述代码中,我们定义了一个名为array的结构数组,其中包含了十个结构类型为point的结构变量:
并且我们对其进行了一部分赋值,最外层的{}代表赋值,里层{}代表数组中每一个变量所包含的值。
八.嵌套结构
先看代码
struct point(
int x;
int y;
}:
struct rectangle {
struct point p1;
struct point p2;
}rec:
1.表示形式
以上rectangle结构中包含着两个类型为 point 的结构变量,在访问变量时,有以下几种形式:
rectangle.p1.x;
rectangle.p1.x;
若再加上一个指针r的话
struct rectangle *r = &rec;
以下几种形式是等价的:
r.p1.x;
r->p1.x;
(r.p1).x;
(r->p1).x;
// ->仅用于指针
2.嵌套结构与数组相结合
若有一个数组recs其中的单元为上述的结构 rectangle,则对其进行赋值时,形式就会比较复杂:
struct rectangle rects[10];
rects[10]={
{{1,2},{3,4}},
{{3,4},{7,8}}
};
很多层的嵌套自然也能实现,只要在输入的时候环环相扣 十分细心就没有问题,不过实际意义可能不与付出成正比
九.typedef
1.功能
声明一个已有的函数类型的新名字。
例: typedef int Length;
在声明了之后,Length 就可以 代替 int 出现在变量定义和参数声明的地方。
2.作用及意义
简化了类型名称,改善了程序的可读性,具有可移植性
3.形式
typedef struct point(
int x;
int y;
}Point:
Point p = {1,2};
Point 就等效于在用typedef之前的 struct point。
或者简单点,在声明完结构类型point之后:
typedef struct point Point;
“Point” 等效于其与typedef之间的代码。