目录
结构体
1.特点
2.声明与定义
3.特殊的结构提成员变量
4.结构体成员变量初始化和访问
5.结构体赋值
6.结构体指针
7.结构体与函数,结构体嵌套结构体
联合体(共同体)
1.c语言联合
2.声明和定义联合
3.访问联合成员变量
结构体
1.特点
? ? ? ? (1)结构是C语言一种派生类型,允许多种数据类型的变量组合起来,自定义成新的类型,这些不同类型的变量称为结构成员变量,变量名称称为结构成员标识符。 ? ? ? ? ? 注:数组是将多个相同类型的变量组合起来,多个变量没有标识符,只能通过下标访 问。
结构特点:
·结构允许多个不同类型变量声明和定义 ·结构也可以没有成员变量,空结构 ·结构成员变量不能是函数类型、结构体本身和void等不完整类型 ·结构成员变量可以包含指向自身的指针,也可以 包含其他类型结构体 ·结构类型同样需要先声明、定义,再使用
2.声明与定义
? ? ? ? ?(1)结构类型既可以单独声明和定义,也可以一并声明和定义,可以使用typedef自定义结构类型名称。
? ? ? ? ? ? ?结构声明的基本语法:
struct 结构类型名 {
成员变量类型1 变量名称1;
成员变量类型2 变量名称2;
...
}结构类型变量名;
注:结构类型名和结构类型变量名可以相同,也可以不同。
例如:以下四种方式是等价的:
// 声明同时定义结构类型 struct student
{
char name[10];
int age;
char sex[4];
};
// 声明和定义结构变量stu1,stu2
struct student stu1,stu2;
// 先声明
struct student;
// 后定义
struct student{
char name[10];
int age;
char sex[4];};
//声明和定义结构变量
struct student stu1,stu2;
typedef struct student
{
char name[10];
int age;
char sex[4];
}STUDENT;
STUDENT stu1,stu2;
注:STUDENT是typedef自定义的新的类型名称,等价于structstudent结构类型 名。
// 同时声明定义结构类型和结构变量
// 省略结构类型名称,此时该匿名结构类型只能 struct
{
char name[10];
int age;
char sex[4];
} stu1,stu2
3.特殊的结构提成员变量
? ? ? ?(1)指向自身的指针变量
结构类型可以包含指向指向自己的指针变量,不能包含自身。
注:这种特性可以用来建立链表、树型等复杂数据结构。
例如:
// 以下正确,指向自身的指针
struct student {
...
struct student *s;
};
// 以下不正确,指向自身
struct student {
...
struct student s;
};
? ? ? ? ??(2)指向其他结构体的成员变量
例如:
struct studentType1 {
...
};
struct studentType2{
...
struct studentType1 ss;
}stu1,stu2;
4.结构体成员变量初始化和访问
? ? ? ? ?成员变量通过点运算符 .访问。
例如:初始化一条学生记录,初始化并且打印出来。
#include <stdio.h>
struct student
{
// 姓名
char name[10];
// 年龄
int age;
// 性别
char sex[4];
// 昵称
char *nickname;};
int main(void){
// 定义变量时直接初始化
struct student stu1 = {
"云中君",
20,
"男",
"风一般的男子"
};
printf("%s\n",stu1.name);
printf("%d\n",stu1.age);
printf("%s\n",stu1.sex);
printf("%s\n",stu1.nickname);
return o;
}
输出结果:
云中君
20
男 风一般的男子
5.结构体赋值
6.结构体指针
? ? ? ? 结构指针,是指向结构体变量的指针,结构指针使用通过->间接访问结构体成员变量。
例如:初始化一条记录,使用结构指针间接访问成员变量
#include <stdio.h>
struct student { // 姓名 char name[10];
// 年龄
int age;
// 性别 char sex[4];
// 昵称 char *nickname;
}; int main(void) // 定义变量时直接初始化 struct student stu1 = { "马超",
20,
"男", "我喜欢的英雄"
};
// 定义结构体指针变量,并且初始化
struct student *sp = &stu1;
printf("%s\n",sp->name);
printf("%d\n",sp->age);
printf("%s\n",sp->sex); printf("%s\n",sp->nickname); return 0;
}
输出结果:
马超
20
男
我喜欢的英雄
7.结构体与函数,结构体嵌套结构体
? ? ? ?(1) 结构体可以直接作为函数参数和返回值,结构体和普通变量一样,通过值传递传给函数参数,也可以作为整体返回值。
? ? ? ? (2) 结构体指针也可以作为参数传递给函数,同样也可以作为函数返回值类型
联合体(共同体) ? ? ? ? ? C语言联合
? ? ? (1)联合,也称为联合体或共用体,语法和结构一样。与结构相比,结构体是有n个成员变量,就分配n个成员的存储空间,各个成员变量独立:联合是有n个成员变量,只分配1个成员变量(最大的成员变量)存储空间,各个成员变量共享相同的内存空间。
? ? ? ?(2)特点:
·可以声明多个不同类型成员变量 ·多个成员变量共享相同存储空间,修改任一变量 影响其它变量的值
? ? ? ? ?声明和定义联合
union 联合类型名称{ 变量成员类型1 变量名1;
变量成员类型2 变量名2; ...
}联合类型变量名
例如:
// 仅声明联合类型
test union test;
// 声明和定义联合类型
test union test
{ int i;
float f;
};
// 声明定义联合类型,并且声明两个联合变量
union test
{ int i;
float f;
}test1,test2; ?
|