c语言:结构体、枚举、宏和动态内存分配
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结构体、枚举、动态内存分配和宏
==========================
【结构体】
一、认识结构体
结构体是一种复合的数据结构,是将基础变量类型和复合的变量类型封装成的新的数据结构体。结构体是一种自定义的类型。
struct sct{
int a;
char b;
};
strct sct aa;
int a;
//如果说,数组是相同类型变量的集合,那么结构体可以是相同元素的集合,也可以是不同元素的集合。
//这里声明了一个结构体,实际上是创建了一个新的变量类型,就像int,本身没有空间。只有用变量类型声明的变量才有空间。如int a。
// 比如int =9,错误。
int main(void)
{
struct sct s1,s2; //声明了两个结构体变量。
//s1有空间,所有s1是一个由int a;char b组成的空间。声明s1,如同声明了一个a和一个b。a和b称为s1的两个成员。
s1.a=9;
s1.b=’T’;
}
问:为什么声明结构体,声明结构体有什么用?
比如说存储班级学生的姓名和学号,
struct student{
char name[];
char ID[20];
};
struct student a[60];
【注】函数是对处理数据的功能的封装。
结构体是对存储数据的数据结构的封装。
二、结构体的赋值和初始化
struct point{
int x;
int y;
};
int main(void)
{
//初始化
//按照每个成员的初始化方式分别初始化。
struct point pp={3,4};
struct point pp2;
struct point pp3;
//赋值
//结构体可以整体赋值。但是没有结构体常量
pp2=pp;
//结构体也可以分别对成员赋值
pp3.x=5;
pp3.y=pp2.x;
printf(“%d %d\n”,pp3.x, pp3.y);
return 0;
}
【注】结构体里也可以包含其它结构体
struct rect{
int num;
struct point p;
};
struct rect re;
re.p.x=9;
re.num=2;
在IOS当中结构体的典型应用(储存坐标)
三、
typedef unsigned long size_t
结构体取别名
typedef existing new
struct point{
int x;
int y;
};
typedef struct point mypoint; //给结构体取别名
struct point aa;
mypoint aa;
应用
mypoint pp={3,4};
或者是
typedef struct point{
int x;
int y;
}mypoint;
或者是
typedef struct{
int x;
int y;
}mypoint;
四、返回结构体的函数
typedef struct{
float x;
float y;
}mypoint;
typedef struct{
float length;
float width;
}mysize;
typedef struct{
mypoint origin;
mysize size;
}myrect;
//因为结构体可以整体赋值,因此结构体可以整体作为函数返回值。myrect myrectmake(float x,float y,float length, float width) {
myrect rect={{x,y},{length,width}};
return rect;
}
int main(void)
{
myrect rect={{100,200},{200,50}};
// rect.origin.x=10;
// rect.origin.y=20;
//太麻烦
rect = myrectmake(10,20,160,32);
return 0;
}
五、结构体的大小
typedef struct{
int a;
int b;
}mysct;
mysct sct;
printf(“ld ld\n”,sizeof(mysct),sizeof(sct));
typedef struct{
int a;
char b;
}mysct;
mysct sct;
printf(“ld ld\n”,sizeof(mysct),sizeof(sct));
typedef struct{
int a;
char b;
char c;
}mysct;
mysct sct;
printf(“ld ld\n”,sizeof(mysct),sizeof(sct));
typedef struct{
char a;
int b;
char c;
}mysct;
mysct sct;
printf(“ld ld\n”,sizeof(mysct),sizeof(sct));
补齐
计算机寻址通常都是以4字节或者是8字节寻址。【注】不同设备对齐方式不同
网络传输时,跨越不同平台,数据传输可能会出错typedef struct{
char a;
int b;
char c;
}__attribute__((packed)) mysct; //不对其,塞满
mysct sct;
printf(“ld ld\n”,sizeof(mysct),sizeof(sct));
六、结构体指针
typedef struct{
int x;