结构体
用户自己建立由不同类型数据组成的组合型数据结构。
格式:
struct 结构体类型名{
数据类型1 成员1;
数据类型2 成员2;
数据类型3 成员3;
数据类型4 成员4;
......
数据类型n 成员n;
}
复制代码
struct Date
{
int year;
int month;
int day;
};
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
复制代码
说明:
由于客观世界非常复杂,可以设计出许许多多结构体类型,例如:struct Teacher、struct Worker、struct Date等结构体类型;
各自包含不同的成员,应视具体情况而定;
成员可以属于另一个结构体类型。
类型定义不分配内存,只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对它也不分配存储单元;
若要在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。
结构体变量
1、先声明结构体类型,再定义该类型变量
例如:struct Student student1,student2;
//初始化结构体的变量
struct Student
{
char name[20];
int age;
};
void main(){
struct Student s = {"xiaoming",20};
printf("name:%s\n age:%d",s.name,s.age);
getchar();
}
复制代码
struct Student
{
char name[20];
int age;
};
void main(){
struct Student s;
s.age = 16;
strcpy(s.name,"xiaoming");
printf("name:%s\n age:%d",s.name,s.age);
getchar();
}
复制代码
2、在声明类型的同时定义变量
struct 结构体名
{
成员表列
} 变量名表列;
例如:
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
} student1, student2;
复制代码
说明:这种方式适用于小程序,对大型程序不适用,一般不采用。
struct Student
{
char name[20];
int age;
}s1, s2 = {"xiaoming",18};
void main(){
s1.age = 16;
strcpy(s1.name,"xiaofang");
printf("name:%s\n age:%d",s2.name,s2.age);
getchar();
}
复制代码
3、不指定结构体类型名而直接定义结构体类型变量(匿名结构体)。
由于未指定了的结构体名称,只能定义一次该类型的变量,通常不采用这种方式。
struct
{
成员表列
}变量名表列;
复制代码
struct
{
char name[20];
int age;
}s1;
void main(){
s1.age = 16;
strcpy(s1.name,"xiaofang");
printf("name:%s\n age:%d",s1.name,s1.age);
getchar();
}
复制代码
说明: 结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间;
结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象;
对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。
结构体嵌套
struct Teacher{
char name[20];
};
struct Student
{
char name[20];
int age;
struct Teacher t;
};
void main(){
struct Student s1 = { "xiaoming", 18, { "Jason" } };
printf("name:%s\n age:%d",s1.name,s1.age);
getchar();
}
复制代码
struct Teacher{
char name[20];
};
struct Student
{
char name[20];
int age;
struct Teacher t;
};
void main(){
struct Student s1;
s1.age = 18;
strcpy(s1.name,"xiaofang");
strcpy(s1.t.name, "MissLee");
printf("name:%s\n age:%d\n Teacher:%s",s1.name,s1.age,s1.t.name);
getchar();
}
复制代码
struct Student{
char name[20];
int age;
struct Teacher{
char name[20];
} t;
};
void main(){
struct Student s1;
s1.age = 18;
strcpy(s1.name,"xiaofang");
strcpy(s1.t.name, "MissLee");
printf("name:%s\n age:%d\n Teacher:%s",s1.name,s1.age,s1.t.name);
getchar();
}
复制代码
结构体与指针
struct Teacher{
char name[20];
};
struct Student{
char name[20];
int age;
};
void main(){
struct Student s1 = {"xiaoming",18};
struct Student* p = &s1;
printf("name:%s\n age:%d\n", s1.name, s1.age);
printf("name:%s\n age:%d\n", (*p).name, (*p).age);
//“->”(箭头)是“(*p).”简写形式
printf("name:%s\n age:%d\n", p->name, p->age);
getchar();
}
复制代码
struct Student{
char name[20];
int age;
};
void main(){
struct Student s1;
s1.age = 18;
strcpy(s1.name,"xiaofang");
struct Student* p = &s1;
printf("name:%s\n age:%d\n",p->name,p->age);
getchar();
}
复制代码
结构体数组和指针
概念:顾名思义是数组中的每一个元素都是结构体变量
struct Student{
char name[20];
int age;
};
void main(){
struct Student s[] = { {"xiaoming",18}, {"xiaofang",17}, {"xiaoai",16} };
struct Student* p = s;
for (; p < s + 3; p++){
printf("name:%s\n age:%d\n", p->name, p->age);
}
printf("------------------------------------------\n");
int i = 0;
for (; i < sizeof(s) / sizeof(struct Student); i++){
printf("name:%s\n age:%d\n", s[i].name, s[i].age);
}
getchar();
}
复制代码
struct Student{
//char name[20];
int age;
double weight;
};
void main(){
struct Student s = { 18,90.00};
//结构体变量的大小,必须是最宽基本数据类型的整数倍
//提升读取的效率
printf("%#x,%d\n", &s, sizeof(s));
getchar();
}
复制代码
结构体与动态内存分配
struct Student{
char name[20];
int age;
};
void main(){
struct Student *s = (struct Man*)malloc(sizeof(struct Student) * 10);
struct Student *p = s;
//赋值
p->age = 18;
strcpy(p->name,"xiaoming");
p++;
p->age = 16;
strcpy(p->name, "xiaofang");
struct Student *loop_p = s;
for (; loop_p < s + 2; loop_p++){
printf("%s,%d\n", loop_p->name, loop_p->age);
}
free(s);
getchar();
}
复制代码
结构体函数指针成员
//Student结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法
struct Student{
char* name;
int age;
void(*sayHi)(char*);
};
void sayHi(char* msg){
MessageBoxA(0, msg, "title", 0);
}
void main(){
struct Student s1;
s1.name = "xiaoming";
s1.age = 18;
s1.sayHi = sayHi;
printf("name:%s age:%d\n", s1.name, s1.age);
s1.sayHi("hello world");
getchar();
}
复制代码