结构体知识总结
一、结构体
①
#include "stdio.h"
#include "string.h"
//1.声明一个结构体类型
struct student
{
int id;
char name;
}; //注意此处的分号,因为这是一条语句
struct student stu; //2.给struct student类型定义一个变量
int main()
{
//3.对结构体成员赋值
stu.id=1542101;
stu.name='a';
//4.打印对应数值
printf("stu.id=%d\nstu.name=%c\n",stu.id,stu.name);
return 0;
}
struct 为结构体关键字,student 是这个结构体的类型名,id name 是结构体的成员。
所以,我们就有了struct student 这一种类型, 类比int 类型一样,都是类型。
//----------------------------------------------------------------------------------------------------------------
// int a; int是一种类型,a是变量;
// struct student stu; struct student 是一种类型,stu是变量(结构体变量);
//----------------------------------------------------------------------------------------------------------------
②
上面声明一个结构体和给结构体定义变量是分开,可以结合一起,在声明类型的同时定义变量。
#include "stdio.h"
#include "string.h"
//1.声明一个结构体类型
struct student
{
int id; //结构体成员
char name;
} stu; //2.给结构体类型定义变量
int main()
{
//3.对结构体成员赋值
stu.id=1542101;
stu.name='a';
//4.打印对应的值
printf("stu.id=%d\nstu.name=%c\n",stu.id,stu.name);
return 0;
}
这种方法定义结构体,后续可以根据需要定义新的变量,如 ZhangSan
# 声明的时候除去student会怎么样呢?
结果如下:
结果显示,打印正常,可是想再定义一个新的结构体变量ZhangSan的时候,本来是struct student ZhangSan的,现在student除去了,自然定义不了。
那怎么办呢?
可以利用typedef关键字,typedef可以为数据类型定义一个别名。如typedef unsigned char uchar;
则uchar 就是unsigned char 的别名。
③
#include "stdio.h"
#include "string.h"
//1.声明一个结构体类型
typedef struct
{
int id; //结构体成员
char name;
}student; //注意:此时student是结构体类型
student stu; //定义结构体变量
student ZhangSan;
int main()
{
//3.对结构体成员赋值
stu.id=1542101;
stu.name='a';
ZhangSan.id=12580;
ZhangSan.name='A';
//4.打印对应的值
printf("stu.id=%d\nstu.name=%c\n",stu.id,stu.name);
printf("ZhangSan.id=%d\nZhangSan.name=%c\n",ZhangSan.id,ZhangSan.name);
return 0;
}
使用typedef之后,不能直接使用student.num,因为student不是变量,而是结构体类型。所以,我们可以用student作为数据类型来定义新的变量,如student stu; 。
④
#include "stdio.h"
#include "string.h"
//1.声明一个结构体类型
typedef struct Student
{
int id; //结构体成员
char name;
} student; //此时student是结构体类型
student stu; //定义结构体变量
student ZhangSan;
int main()
{
//3.对结构体成员赋值
stu.id=1542101;
stu.name='a';
ZhangSan.id=12580;
ZhangSan.name='A';
//4.打印对应的值
printf("stu.id=%d\nstu.name=%c\n",stu.id,stu.name);
printf("ZhangSan.id=%d\nZhangSan.name=%c\n",ZhangSan.id,ZhangSan.name);
return 0;
}
一般typedef struct 后面我都不会省略Student,习惯了typedef struct Student。此刻student 就是struct Student的一个别名。 实现效果一样。
二、结构体指针
①
我们知道,指针可以指向任何的类型。回忆一下指针的知识:
那么结构体指针变量也是类似:
#include "stdio.h"
#include "string.h"
//1.声明一个结构体类型
typedef struct Student
{
int id; //结构体成员
char name;
}student; //此时student是结构体类型
student jay; //2.定义结构体变量jay
student* point=&jay; //3.定义结构体指针变量point,指向jay变量
int main()
{
jay.id=123; //4.通过结构体变量给成员变量id赋值
printf("id=%d\n",jay.id);
printf("id=%d\n",(*point).id);
point->id=456; //5.通过结构体指针给成员变量id赋值
printf("id=%d\n",(*point).id);
printf("id=%d\n",point->id); //.的优先级大于*
return 0;
}
// (*point).id和point->id的效果是一样的,(*point).id太麻烦,一般我们都用point->id ,简洁明了。
②
从上面的看到声明了结构体类型后,定义了结构体变量jay,再定义结构体指针point,并指向jay,
还有没其他写法?
#include "stdio.h"
#include "string.h"
//声明一个结构体类型
typedef struct Student
{
int id; //结构体成员
char name;
}student,*pstu ; //student相当于struct Student,pstu相当于struct Student*
student jay; //相当于struct Student jay
pstu point = &jay; //相当于struct Student * point
int main()
{
point->id=789; //赋值
printf("id=%d\n",point->id);
return 0;
}
③
定义函数来赋值,进行函数调用,怎么写的呢?
#include "stdio.h"
#include "string.h"
//声明一个结构体类型
typedef struct Student
{
int id; //结构体成员
char name;
}student; //此时student是结构体类型
student jay; //定义结构体变量jay
//定义一个函数来赋值,参数类型为student,形参是指针
void student_test(student *someone) {
someone->id=111; //赋值
}
int main()
{
student_test(&jay); //传入实参:结构体变量jay的地址
printf("id=%d\n",jay.id);
return 0;
}
④
我们再来改一下:
#include "stdio.h"
#include "string.h"
//声明一个结构体类型
typedef struct Student
{
int id; //结构体成员
char name;
}student; //此时student是结构体类型
student jay; //定义结构体变量jay
student* point=&jay; //定义结构体指针变量point,指向jay
//定义一个函数来赋值,参数类型为student,形参是指针
void student_test(student *someone)
{
someone->id=111; //赋值
}
int main()
{
student_test(point); //传入实参:结构体指针变量point
printf("id=%d\n",jay.id);
printf("id=%d\n",point->id);
return 0;
}