结构体学习
提示:以下是本篇文章正文内容,下面案例可供参考
一、结构体变量定义方式
结构体是一种数据类型不同相关变量or数组的集合
,构成结构体这些变量称为结构体的成员
。
回顾数组定义:数组成员数据类型相同,可以通过下标来区分不同元素。在定义数组时,需要给出数组类型 数组名 数组长度
如
int a[10];
结构体定义:需要给每个结构体变量名字+数据类型
如 struct
{
int a[10];
char a[8]
}st1,st2; //前面相当于数据类型 st1和st2则为变量
以上的结构体直接定义了结构体变量,若再使用结构体类型时不方便使用,因此我们有了结构体标识符
struct student
{
int age;
float score;
}; //student则是结构体标识符
有了结构体标识符,则可以定义结构体变量,如:
struct student st1,st2;//定义结构体变量
以上也可以在定义标识符的同时定义结构体变量。
下面介绍第三种方式
typedef struct
{
int a;
float b;
}TypeDef;
TypeDef a;
二、结构体变量的引用
回顾数组引用:一般不能将数组作为一个整体进行输入、输出或者运算
结构体引用:同样,结构体变量也不能作为整体进行输入、输出、运算,赋值运算除外
.只能针对结构体变量的成员
进行这些操作
结构体成员属于结构体变量的组成部分,不能脱离结构体变量单独使用
st1.age //结构体变量的成员
对于结构体变量的操作与同类型变量相同,其本质也是变量或数组
/*eg:构建结构体变量,存入以下数据,并输出
姓名:张三
学号:10086
分数:60
*/
#include<stdio.h>
struct student
{
char name=[10];
char num=[10];
int score;
};
int main()
{
struct student st1;
st1.score=60;
st1.name="张三"
st1.num="10086"
printf("%s","%s","%d/n",st1.name,st1.num,st1.score);
return 0;
}
/*运行后该程序出现ERR
原因是给数组名直接赋值了
st1.name="张三"
st1.num="10086"
两者均为字符数组,其属于指针常量
*/
//方式1:使用strcpy函数
//修正后需使用strcpy()函数,并且需要添加其头文件#include<string.h>
//将字符串存入字符数组中
strcpy(st1.num,"10086");
strcpy(st1.name,"张三");
printf("姓名\t,学号\t,分数\n"); //\t水平制表符相当于TAB键
printf("%s\t,%s\t,%d\n",st1.name,st1.num,st1.score);
//方式2:直接在初始化赋值
三、结构体指针
回顾指针:指针的基本功能为间接引用。
如:局部变量的跨函数改写,只能通过间接引用才能实现。
结构体指针的功能就是间接引用结构体变量
如在动态链表中只能借助结构体指针才能实现
定义:
typedef struct
{
char name=[10];
char num=[10];
int score;
}ST;
ST st1,*p;
p=&st1; //定义了结构体指针P,P是指向结构体变量st1的结构体指针
结构体变量整体赋值
;方式1:直接赋值;方式2:结构体指针赋值
方式一:
/*
eg:已知信息:姓名:张三
学号:10086
分数:60
要求:使用初始化方式,将数据存入结构体变量中
再将该结构体变量的内容,复制到另一个相同类型的结构体变量中
注意:结构体变量不能整体输入、输出、运算,只能对成员进行操作,对成员进行复制,是否也需要逐个对成员进行操作呢?
结构体赋值运算是特例
*/
#include<stdio.h>
typedef struct
{
char name[10];
char num[10];
int score;
}ST;
void main()
{
ST st1={"张三","10086","60”},st2;//两个结构体变量st1 st2
st2=st1;
return 0;
}
方式二:
#include<stdio.h>
typedef struct
{
char name[10];
char num[10];
int score;
}ST;
int main(void)
{
ST st1={"小明","10086","60"},st2,*p,*q;
p=&st1;
q=&st2;
*q=*p;
return 0;
}
结构体指针访问成员:
一般形式为
(
*结构体指针)
.成员名
typedef struct
{
char name[10];
char num[10];
int score;
}ST;
int main()
{
ST st1;*p=&st1;
(*p).score=10;
return 0;
}
以上使用(*p).成员名较为复杂,可使用。结构体指针->成员名
ST st1,*p=&st1;
(*p).score=60;
等价于
p->score=60;
四、具体应用案例
4.1 STM32_Hal库函数结构体指针作函数传参
4.2 DSP28335中结构体与联合体、位域
提示:这里对文章进行总结: