基本类型
|--指针类型
构造类型
|--结构体
|--共用体
|--枚举
一、结构体的概念:
是一种程序员自己定义的数据类型
1>数据类型是抽象的而变量是具体的
2>先有类型后有变量
3>数据是万事万物
typedef struct box
{
int length;
int width;
int high;
}BOX;
typedef struct book
{
char bookName[100];
float price;
int isbn[100];
}BOOK;
typedef struct fan
{
int w;//功率
int brand;//品牌
}FAN;
注意:
1>类型名可以省略,但是最好不要
2>typedef 也可以省略,但是此时类型的别名就变成了变量名
,最好不要这样
3>结构体通常定义在文件作用域中,表示到处可以使用该结构体
语法上可以将结构体定义在函数作用域,表示该结构体只能
在所在的函数的函数中使用
demo
void foo(void)
{
typedef struct pt
{
int x;
int y;
}PT;//PT类型只能在foo函数中使用
}
4>属性的类型不能“自引用”
typedef struct point
{
int x;
int y;
struct point* next;//OK 指针占据4byte
struct point pre;//错误,不能自引用
POINT curr;//错误,因为超出了POINT的作用域,而且是自引用
}POINT;
5>可以嵌套定义结构体,至少允许15层
date结构体并不是person私有结构体,date是公用的!
而且date的属性(year month day)是暴露在person中的
typedef struct person
{
struct date
{
int year;
int month;
int day;
};
}PERSON;
int main(void)
{
PERSON me;
me.day;
me.month;//可以直接使用
me.year;
}
二、用
2.1内存结构
注意:
(内存对齐)
1>内存结构的变量,每一个属性都要占据内存
系统从上自下的为每一个属性分配内存
2>要判断属性的地址是否为当前属性长度的整数倍,
如果地址不是属性长度的整数倍,就会扩展到整数倍
3>最后总的内存大小必须是最长分量的整数倍
2.2初始化 和 赋值
demo
typedef struct date
{
int year;
int month;
}DATE;
typedef struct point{
int x;
int y;
DATE date;
}POINT ;
int main(void)
{
//初始化
POINT a;
a = { 0,0,0,0};
POINT b[3] = {
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };
POINT c[2][3] = {
{ { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } },
{ { 0, 0, 0, 0}, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }
};
//赋值
a.x = 0;
a.y = 0;
a.date.month = 0;
a.date.year = 0;
//通过指针赋值
POINT* p = &a;
(*p).x = 0;
(*p).y = 0;
(*p).date.month = 0;
(*p).date.year = 0;
p->x = 0;
p->y = 0;
p->date.month = 0;
p->date.year = 0;
return 0;
}
3.3结构体变量的用法:
类型相同的结构体变量可以赋值,但是不能比较
typedef struct kk
{
char address[100];
}KK;
typedef struct tt
{
char tel[100];
char name[100];
KK kk;
}TT;
int main(void)
{
TT a, b;
strcpy(a.name, "kkk");
strcpy(a.tel, "10010");
strcpy(a.kk.address, "china");
b = a;
puts(b.name);
puts(b.tel);
puts(b.kk.address);
strcmp(b.name, a.name);
return 0;
}
3.4结构体变量作为函数的参数和返回值