指针的内容需要自己理解,这里不再解释了。
下面是个人理解,也许有的地方理解错了,欢迎指出和交流
结构体
在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。
结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。
结构体的定义形式
struct 结构体名{
结构体所包含的变量或数组
};
此外,我们也可以直接省略掉结构体名 可以省略但是不建议省略
如果省略变量名, 则变成对结构的申明,结构体的声明只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
注意大括号后面的分号;
不能少,这是一条完整的语句。
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)
结构体变量
既然结构体是一种数据类型,那么就可以用它来定义变量。
struct stu stu1, stu2;
定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 5 个成员组成。注意关键字struct不能少。
我的理解:结构体名不同,相当于不同的数据类型。
例如:
#include<stdio.h>
int main()
{
//定义一个结构体 名为student student类型的结构体变量stu1
struct student
{
double height;//double类型 体重
char * name;//字符串 名字
}stu1;
//定义一个结构体 名为teachar teachar 类型的结构体变量tch1
struct teachar
{
double height;//double类型 体重
char * name;//字符串 名字
}tch1;
//进行赋值显示
stu1.name="bzc";
printf("name:%s\n",stu1.name);
tch1.name="bzc";
printf("name:%s\n",tch1.name);
return 1;
}
你也可以在定义结构体的同时定义结构体变量:
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
通过“结构体变量名.成员名”的方式给结构体成员赋值
stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 136.5;
读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
有没有觉得很麻烦,我们隐隐约约察觉到,多写一个struct很费劲,因此才有了下面的typedef
typedef
参考文章链接:https://blog.csdn.net/libing403/article/details/73402411
定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。
使用typedef时要记住,typedef并没有创建任何新类型,它只是为某个已存在的类型增加一个方便使用的标签。
它与#define
有3个不同点:
(1)与#define
不同,typedef创建的符号名只受限于类型,不能用于值。
(2)typedef由编译器解释,不是预处理器。
(3)在其受限范围内,typedef比#define
更灵活。
用法
1) 为基本数据类型定义新的类型名
示例:假设要用BYTE表示1字节的数组。
typedef unsigned char BYTE;
- 随后就可以用BYTE来定义变量:
BYTE X,Y[10],*Z;
- 上面一行代码就相当于
unsigned char X,Y[10],*Z;
2) 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
参考文章链接:http://c.biancheng.net/view/298.html
struct Point
{
double x;
double y;
double z;
};
在调用这个结构体时,我们必须像下面的代码这样来调用这个结构体:
struct Point oPoint1={100,100,0};
struct Point oPoint2;
现在,我们利用 typedef 定义这个结构体,如下面的代码所示:
typedef struct tagPoint
{
double x;
double y;
double z;
} Point;
1、定义了一个新的结构类型
2、使用 typedef 为这个新的结构起了一个别名,叫 Point,即:
所以,现在你就可以像 int 和 double 那样直接使用 Point 定义变量。
Point pt1;
也可以这样使用
先定义结构体
struct student
{
double height;//double类型 体重
char * name;//字符串 名字
};
//再给student结构体起一个简称stu
typedef struct student stu;
//申明一个stu结构体类型变量stu1
stu stu1
结构体指针(先理解一下指针的意义)
指针的意义:https://www.cnblogs.com/douzi2/p/4934130.html
使用结构指针对结构成员的访问, 与结构变量对结构成员的访问在表达方式 上有所不同
结构指针名->结构成员
定义结构体指针
//首先定义一个teachar结构体,简称tch,
typedef struct teachar
{
int age;
double height;//double类型 体重
char * name;//字符串 名字
}tch;
现在相当于有一个stu的数据类型了,和 int 一样
我可以定义一个结构体变量和int类型变量
tch tch1;
int a;
那我也可以定义一个int类型指针和tch类型的指针啊
int *b;
tch *tch2;
把tch2指向tch1的首地址
tch2=&tch1
tch2->age=25;