- @[TOC]结构体拷贝
#include <stdio.h>
struct People{
int age;
char* name;
};
int main()
{
struct People p;
p.age = 20;
p.name = "zhangshan";
printf("age:%d\n",p.age);
struct People p1 = p; //内存的拷贝
p.age = 100;
p.name = "lisi";
printf("age:%d\n",p1.age);
return 0;
}
- 结构体指针
其中->和.的区别:
A *p则使用:p->mode; 左边是结构指针。
A p 则使用:p.mode; 左边是结构变量。
总结:
箭头(->):左边必须为指针;
点号(.):左边必须为实体。
指针指向的结构体需要取地址&,数组不需要,数组名称指向第一个数组内容地址。
#include <stdio.h>
#include <stdlib.h>
typedef struct STRUCT_SAVEDATA
{
u8 edit_mode[10]; //可编辑模式
u8 level; //速度
u8 mode; //模式单一模式
u16 time; //工作时间
}Savedata_TypeDef;
Savedata_TypeDef Run_d;
Savedata_TypeDef Save_data;
int main()
{
Save_data.mode=10;
Run_d=Save_data; //结构体复制
Run_d.mode=100;
Savedata_TypeDef *p_s=malloc(sizeof(Run_d));//申请一个结构体空间,指向这个空间地址
p_s=&Save_data;
p_s->mode=102; //修改Save_data里的值
Savedata_TypeDef *p_s1=&Run_d; //指向Run_d结构体
printf("p_s Savedata_TypeDef.mode\n%d\n",p_s->mode);//测试功能
printf("p_s1 Savedata_TypeDef.mode\n%d\n",p_s1->mode);//测试功能
free(p_s);
}
- 函数指针
#include <stdio.h>
#include <stdlib.h>
Savedata_TypeDef Run_d;
void Save_disp(){
Save_data.mode=10;
Run_d=Save_data;
Run_d.mode=100;
Savedata_TypeDef *p_s=malloc(sizeof(Run_d));
p_s->mode=101;
printf("p_s Savedata_TypeDef.mode\n%d\n",p_s->mode);//测试功能
p_s=&Save_data;
printf("p_s Savedata_TypeDef.mode\n%d\n",p_s->mode);//测试功能
p_s->mode=102;
printf("p_s Savedata_TypeDef.mode\n%d\n",Save_data.mode);//测试功能
Savedata_TypeDef *p_s1=&Run_d;
printf("p_s1 Savedata_TypeDef.mode\n%d\n",p_s1->mode);//测试功能
}
int main()
{
void (*vp_s)(); //通过一个函数指针
vp_s=Save_disp;//指向函数
vp_s(); //通过指针来执行
while(1);
}
- C语言面向对象
#include <stdio.h>
#include <stdlib.h>
typedef struct STRUCT_SAVEDATA
{
u8 edit_mode[10]; //可编辑模式
u8 level; //速度
u8 mode; //模式单一模式
u16 time; //工作时间
}Savedata_TypeDef;
Savedata_TypeDef Run_d;
void Save_disp(){
Save_data.mode=10;
Run_d=Save_data;
Run_d.mode=100;
Savedata_TypeDef *p_s=malloc(sizeof(Run_d));
p_s->mode=101;
printf("p_s Savedata_TypeDef.mode\n%d\n",p_s->mode);//测试功能
p_s=&Save_data;
printf("p_s Savedata_TypeDef.mode\n%d\n",p_s->mode);//测试功能
p_s->mode=102;
printf("p_s Savedata_TypeDef.mode\n%d\n",Save_data.mode);//测试功能
Savedata_TypeDef *p_s1=&Run_d;
printf("p_s1 Savedata_TypeDef.mode\n%d\n",p_s1->mode);//测试功能
}
typedef struct
{
int age;
Savedata_TypeDef Run_d;
void (*save_dis)();
}s_typedef;
s_typedef *S_Create()
{
return malloc(sizeof(s_typedef));
}
void S_Delete(s_typedef *s)
{
free(s);
}
s_typedef* S_Init(s_typedef* s,uint8_t mode)
{
memset(&s->Run_d,0,sizeof(s->Run_d));
s->age= mode;
s->Run_d.mode=mode;
s->save_dis=Save_disp;
return s;
}
int main()
{
s_typedef *s=S_Init(S_Create(),20);
s->save_dis();
S_Delete(s);
while (1)
{
}
}
6.结构体函数指针应用
struct _m_usart_dev
{
int a;
void (*init)(int); //初始化函数指针
int (*ins)(int); //识别函数名及参数
void (*print)(); //打印函数指针
};
void init(int sum);
int insert(int num);
void print();
extern struct _m_usart_dev dev;
//初始化函数
void init(int sum)
{
dev.a = sum;
}
//识别函数
int insert(int num)
{
dev.a = num;
return 1;
}
//打印函数指针
void print()
{
printf("%d\n", dev.a);
}
//结构体初始化
struct _m_usart_dev dev =
{
0,
init,
insert,
print,
};
int main()
{
dev.init(0);
dev.ins(10);
dev.print();
while (1)
{
}
}
- 头文件防止重复
#ifndef __WORK_H
#define __WORK_H
#include "stm32f10x_conf.h"
#define TIME_HOLD 3 //默认保持时间
#define TIME_SHORTIDLE 3 //短间歇时间
#define TIME_LONGIDLE 20 //长间歇时间
#define TIME_HOLDA 3 //A保持时间
#endif