构造类型
数据类型分类:
- 基本类型:
- 整数型
- 短整型:short(2字节)
- 整型:int(4个字节)
- 长整型:long(8个字节)
- 长长整型:long long
- 浮点型
- 单精度:float(4个字节)
- 双精度:double(8个字节)
- 字符型:char(1个字节)
- 整数型
- 指针类型
- 数据类型*:int*,char*,float*等
- void*:任意数据类型指针
- 空类型
- void:没有返回值或者没有形参(不能定义变量)
- 自定义类型/构造类型
- 结构体类型:struct
- 共用体类型(联合体):union
- 枚举类型:enum
注意:整数型和字符型分为有符号signed和无符号unsigned,默认时有符号,有符号可以省略关键字
结构体类型
定义:自定义数据类型的一种,关键字(struct),结构体类型的变量,可以存储多个不同数据类型的数据
定义格式:
struct 结构体名
{
数据类型1 成员名称1;
数据类型2 成员变量2;
……
}
注意:结构体中定义的变量称之为成员变量
格式说明:
- 结构体名:合法的标识符,建议单词的首字母大写
- 数据类型n:C语言支持的所以类型
- 成员名称:合法的标识符,就是变量的命名标准
- 数据类型n 成员名称n:类似于定义变量,定义了结构体中成员
注意:
- 结构体在定义的时候成员不能赋值
- 举例
struct Cat
{ int age = 5;// 错误,结构体定义的时候,成员不能赋值
double height; // 正确
}
常见的定义格式:
- 方式一:常规定义(只定义类型)--推荐
- 方式二:定义匿名结构体(常用于作为其他结构体的成员使用)
注意:定义匿名结构体类型的同时必须定义结构体变量,否则编译报错,结构体可以作为另一个结构体的成员
总结:
- 结构体可以定义在局部位置,也可以定义在全局位置
- 全局位置的结构体名和局部位置的结构体名可以相同,就近原则(和普通变量的定义同理)
结构体类型的使用:利用结构体类型定义变量,定义数组;结构体类型的使用与基本数据类型的使用类似
三种定义结构体变量:
结构体便改良也成为结构体实例
- 第一种:
- 先定义结构体
- 然后使用(ctruct结构体名 变量名)
- 第二种:
- 在定义结构体的同时定义结构体变量
此时定义了一个结构体A,x,y是这个结构体类型的变量
- 第三种:
- 在定义匿名结构体的同时,定义结构体变量
说明:此时定义了一个没有名字的结构体(匿名结构体),x,y是匿名结构体类型的变量
匿名结构体:弊大于利(尽量少用)
优点:少写一个结构体名称
缺点:只能使用一次;定义的结构体类型的同时必须定义变量
应用场景:
- 当我们结构体的类型只需要使用一次,并且定义类型的同时定义变量
- 作为其他结构体的成员使用
定义结构体的同时,定义结构体变量初始化
- 结构体成员部分初始化时,大括号不能省略
- 如果赋值没有歧义,编译和运行没有问题
- 如果赋值推导有歧义,编译就会报错
- 结构体成员没有默认值,是不确定的数
/**
* 结构体变量的定义
*/
#include <stdio.h>
// 先定义结构体,再定义结构体变量
void fun1()
{
// 先定义结构体
struct A
{
int a;
char b;
};
// 再定义结构体变量
struct A x;
struct A y;
}
// 定义结构体的同时定义结构体变量
void fun2()
{
struct A
{
int a;
char b;
} x,y;
struct A z;
}
// 定义匿名结构体的同时定义结构体变量
void fun3()
{
struct
{
int a;
char b;
} x,y;
struct
{
int a;
char b;
} z;
}
int main()
{
fun1();
fun2();
fun3();
return 0;
}
结构体变量的使用
结构体变量访问结构体成员
格式:结构体变量名.成员名
1.可以通过访问给成员赋值(存数据)
2.可以通过访问获取成员值
结构体变量未初始化,结构体的成员值随机(不确定)
结构体变量在定义是可以初始化
- 建议用大括号标明数据的范围
- 结构体成员初始化时,可以部分初始化,部分初始化时,一定要带大括号表明数据的范围
案例:
/**
* 结构体变量的初始化
*/
#include <stdio.h>
/* 全局的结构体(数据类型) */
struct Dog
{
char *name;// 姓名
int age;// 年龄
char sex;// M:公,W:母
};
/* 先定义,再初始化 */
void fun1()
{
// 定义一个结构体
// struct Dog
// {
// char *name;// 姓名
// int age;// 年龄
// char sex;// M:公,W:母
// };
// 定义结构体变量
struct Dog dog;
// 给结构体变量的成员赋值
dog.name = "旺财";
dog.age = 5;
// 访问结构体变量的成员
printf("%s,%d,%c\n",dog.name,dog.age,dog.sex);
}
/* 定义的同时初始化 */
void fun2()
{
// 定义结构体变量并初始化
struct Dog dog = {"招财",23,'M'};
// 修改成员的值
dog.name = "进宝";
// 访问结构体变量的成员
printf("%s,%d,%c\n",dog.name,dog.age,dog.sex);
}
int main()
{
fun1();
fun2();
return 0;
}