结构体
引入:
在有些时候需要将不同类型的数据组成一个有机的整体,如将学生的姓名,学号,年龄等组织在一起,这时使用结构体是最方便的。
1、结构体类型的声明:
struct 结构体名{
成员列表 //成员也可以是结构体
} ; //注意这里一定要有分号
2、结构体变量的定义:
1、先声明结构体类型,再定义变量;
struct 结构体名{
成员列表;
} ;
结构体类型名 变量名列表;
如:
struct student
{
char num[5];
char name[10];
char sex;
int age;
float score;
};
struct Student stu1,stu2;
//定义了两个变量 stu1 和 stu2,它们都是 Stu 类型,都由 5 个成员组成
//注意关键字 struct 不能少
2、在定义结构体的同时定义结构体变量;
如;
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
//在定义结构体 Stu 的同时,创建了两个结构体变量 stu1 和 stu2
3、方式 3-如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体数据类型,定义其他变量,在定义时也可以不给出结构体名。
如;
struct {
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
//1. 该结构体数据类型,没有名, 匿名结构体
//2. stu1 和 stu2 就是 该结构体的两个变量
3、结构体变量的赋值
结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标[ ]获取单个元素,结构体使用点号.获取单个成员。获取结构体成员的一般格式为
结构体变量名.成员名;
代码演示:
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1;
stu1.name="jieke";
stu1.age=5;
stu1.sex='m';
stu1.group=1;
stu1.score=90;
或者是
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} ;
struct student stu1={"jieke",5,'m',1,90};
或者是
struct Student{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = {"贾宝玉", 11, 18, 'B', 90.50}, stu2 = { "林黛玉", 12, 16, 'A', 100 };
struct Student stu3 = {"林黛玉 2", 12, 16, 'A', 100 }; //在定义结构体变量时,整体赋值,需要对应
注意下面这种情况不可以
struct Student stu4;
stu4 = {"林黛玉 2", 12, 16, 'A', 100 }; // 这样赋值不可以
stu4.name = "smith"; //这种是可以的
4、成员
基本介绍
- 从叫法上看:有些书上称为成员, 有些书说 结构体包含的变量
- 成员是结构体的一个组成部分,一般是基本数据类型、也可以是数组、指针、结构体等 。比如我们前面定义
Cat 结构体 的 int age 就是一个成员。
注意事项和细节说明
- 成员声明语法同变量,示例: 数据类型 成员名;
- 字段的类型可以为: 基本类型、数组或指针、结构体等
- 在创建一个结构体变量后,需要给成员赋值,如果没有赋值就使用可能导致程序异常终止。
- 不同结构体变量的成员是独立,互不影响,一个结构体变量的成员 更改,不影响另外一个。
5、使用结构体数组
定义结构体数组的方法和定义结构体变量相仿,只需要指明其为数组即可。
定义的方法和定义结构体变量一样有三种。
案例演示:
1)编写一个 Dog 结构体,包含 name(char[10]),age(int)、weight(double)属性
2) 编写一个 say 函数,返回字符串,方法返回信息中包含所有成员值。
3) 在 main 方法中,创建 Dog 结构体变量,调用 say 函数,将调用结果打印输出。
#include<stdio.h>
#include<stdlib.h>
struct Dog
{
char *name;
int age;
double weight;
};
char *say(struct Dog dog)
{
//将这个信息放入到一个字符串(字符数组)
static char info[50]; //函数种拘捕变量通常摇使用静态局部变量,从而避免空间被销毁
sprintf(info,"name=%s age=%d weight=%.2f", dog.name,dog.age,dog.weight);//sprintf 是个变参函数,定义是:sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。
return info;
}
int main()
{
//定义结构体变量
struct Dog dog;
char *info=NULL;
dog.name = "xiaohua";
dog.age=2;
dog.weight=5;
info=say(dog);
printf("小狗的信息为:\n%s",info);
return 0;
}
小狗的信息为:
name=xiaohua age=2 weight=5.00
Process returned 0 (0x0) execution time : 0.514 s
Press any key to continue.
共用体
基本介绍
1)共用体(Union)属于 构造类型,它可以包含多个类型不同的成员。和结构体非常类似, 但是也有不同的地方.
共用体有时也被称为联合或者联合体, 定义格式为
union 共用体名{
成员列表
};
**2) 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员
占用同一段内存,该空间的大小以占用最大的成员为准,修改一个成员会影响其余所有成员。 **
代码演示:
//共用体的定义及初始化
#include<stdio.h>
#include<stdlib.h>
union data //data 就是一个共用体(内存布局), 包含三个成员, 共享数据空间, 该空间的大小以占用最大的成员为准,这里int型空间最大,所以内存空间为int型
{
int n;
char ch;
short m;
};
void main()
{
union data a;//定义两个一个 共用体变量 a
printf("%d, %d\n", sizeof(a), sizeof(union data) ); // 4, 4
a.n = 0x40;//16 进制
printf("%d, %c, %d\n", a.n, a.ch, a.m);
a.ch = '9'; //
printf("%d, %c, %d\n", a.n, a.ch, a.m);
a.m = 0x2059;
printf("%d, %c, %d\n", a.n, a.ch, a.m);
a.n = 0x3E25AD54;
printf("%d, %c, %d\n", a.n, a.ch, a.m);
}
输出:
4, 4
64, @, 64
57, 9, 57
8281, Y, 8281
1042656596, T, -21164
Process returned 22 (0x16) execution time : 0.343 s
Press any key to continue.
注意:当为成员赋值时从低位开始,比如上图的右边为低位;下图则是上面的是低位。