一、结构体三种定义方式和使用
- 方式一,常规定义方式
#include<stdio.h>
struct Stu
{
int age;
char name[20];
};
int main()
{
struct Stu a, b, c;
a.age = 10;
}
- 方式二,这种方式可以在定义结构体后顺便定义几个该结构体的变量,之后仍然可以定义。
#include<stdio.h>
struct Stu
{
int age;
char name[20];
}stu1,stu2;
int main()
{
struct Stu stu3;
stu3.age = 12;
stu1.age = 10;
}
- 方式三,这种方式不写结构体名称,只能使用顺便定义的结构体变量,后续无法继续定义其他变量。
#include<stdio.h>
struct
{
int age;
char name[20];
}stu1,stu2;
int main()
{
stu1.age = 10;
}
二、给结构体起类型名
这一步主要是简化了定义类型名时struct 类型名 变量名;
这一步骤的繁琐。
#include<stdio.h>
typedef struct stu
{
int age;
char name[20];
}Stu;
int main()
{
Stu s;
s.age = 10;
}
这样就可以直接用Stu
来替代struct stu
了。
三、结构体变量的三种赋值方式
- 在定义变量时赋值,可以不给所有成员都赋值,但是必须从上往下赋值,不能出现中间隔着一个成员不赋值的情况。
#include<stdio.h>
typedef struct stu
{
int age;
char name[20];
}Stu;
int main()
{
Stu s = {
18,
"张三"
};
printf("age = %d name = %s", s.age, s.name);
}
- 定义变量后再一个个赋值
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
int age;
char name[20];
}Stu;
int main()
{
Stu s;
s.age = 18;
strcpy(s.name, "zhangsan");//数组名不能直接赋值
printf("age = %d name = %s", s.age, s.name);
}
- 用一个结构体变量给另一个结构体变量赋值。前提是一定要是同一个结构体。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
int age;
char name[20];
double score;
}Stu;
int main()
{
Stu s1 = {
10,
"zhangsan",
98.5
};
Stu s2 = s1;
printf("%d\n", s2.age);
}
四、结构体数组
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
int age;
char name[20];
double score;
}Stu;
int main()
{
Stu s[3] = {
{18,"zhangsan",99},
{18,"lisi",97},
{18,"wangwu",95}
};
printf("%s\n", s[0].name);//zhangsan
printf("%s\n", s[1].name);//lisi
printf("%s\n", s[2].name);//wangwu
return 0;
}
五、结构体指针
- 结构体指针的定义以及对成员的访问
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
int age;
char name[20];
double score;
}Stu;
int main()
{
Stu s = {
18,
"zhangsan",
98.5
};
Stu* p = &s;
printf("name = %s\n", (*p).name);//方式一
printf("name = %s\n", p->name);//方式二
return 0;
}
- 结构体指针指向的地址就是结构体第一个成员变量的地址。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
int age;
char name[20];
double score;
}Stu;
int main()
{
Stu s = {
18,
"zhangsan",
98.5
};
Stu* p = &s;
printf("&age = %p\n", &s.age);//00BBFB2C
printf("p= %p\n", p);//00BBFB2C
return 0;
}
验证完成,结论正确。
六、结构体开辟内存规则
给结构体变量分配内存的时候,会去结构体变量中找基本类型的成员,哪个基本类型的成员占字节数多,就以它大小为单位开辟内存:
- 成员中只有char类型,以1字节为单位开辟内存。
- 成员中出现short int,且没有更大字节数的基本类型,以2字节为单位开辟内存。
- 出现int,float,指针,没有更大字节数的基本类型,以4字节为单位开辟内存。
- 出现double类型的数据,分情况:
4.1 在vc6.0和vs中,以8字节为单位开辟内存。
4.2 在Linux环境的gcc下,以4字节为单位开辟内存。
使用 #progma pack(2)
可以手动指定对齐值value
- value只能是:1,2,4,8等二的次方
- 指定对齐值与结构体成员数据类型对齐值相比取较小值。