C语言
陈学弟
gcc hello_word.c
展开
-
标准库与HAL库区别
每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx...之类的。·将寄存器底层操作都封装起来,提供一整套接口(API)供开发者调用。配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。SF公司目前主力推的开发方式,新的芯片已经不再提供标准库。·大大降低单片机开发难度,但是在不同芯片间不方便移植。为了兼容所有芯片,导致代码量庞大,执行效率低下。深入理解单片机的运行原理,知其然更知其所以然。寄存器众多,需要经常翻阅芯片手册,费时费力。更大灵活性,可以随心所欲达到自己的目的;原创 2023-01-29 00:37:34 · 2343 阅读 · 0 评论 -
数据结构(队列)
队列(Queue)。队列简称队。是一种操作受限的,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。其操作特性为先进先出(First In First Out,FIFO),并且只允许在队尾进,队头出。队头(Front):允许删除的一端,又称队首队尾(Rear):允许插入的一端空队列:不包含任何元素的空表。原创 2023-01-01 18:56:00 · 92 阅读 · 0 评论 -
数据结构(栈)
栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出结构)。原创 2022-11-20 17:55:41 · 202 阅读 · 0 评论 -
C51之温湿度检测系统(自动开关风扇)
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗;自动控制![在这里插入图片描述](https://img-blog.csdnimg.cn/47c96a99f371492d8e5e74579d086692.png)原创 2022-10-06 21:11:04 · 1130 阅读 · 0 评论 -
C51串口通信(蓝牙)
串口通信就是单片机和pc之间的一种通信方式。通信方式:并行,串行,同步,异步(最常用的)传输方向:单工,半双工(不同时间),全双工注:SYSClk是晶振char cmd;//波特率不倍速 SCON = 0x50;//8位数据,可变波特率 AUXR &= 0xBF;//定时器1时钟为Fosc/12,即12T AUXR &= 0xFE;//串口1选择定时器1为波特率发生器 TMOD &= 0x0F;//清除定时器1模式位 TMOD |= 0x20;原创 2022-09-08 21:05:28 · 3224 阅读 · 1 评论 -
C51定时器和中断
C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器或者计数器使用。确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。而当配置为计数器时,每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。标准C51有2个定时器/计数器:T0和T1。他们的使用方法一致。C52相比C51多了一个T2。原创 2022-09-05 01:18:54 · 924 阅读 · 0 评论 -
指针动态空间函数
malloc函数:开创动态空间格式:(类型)malloc(大小)memset函数:初始化空间格式:memset(变量名,初始化格式,空间)realloc函数:追加空间格式:realloc(变量名,大小)原创 2022-05-15 14:51:40 · 71 阅读 · 0 评论 -
volatile函数的功能
volatile函数:防止编译器自动优化原创 2022-05-13 18:27:28 · 427 阅读 · 0 评论 -
结构体指针函数之选票系统
#include<stdio.h>#include<string.h>#include<stdlib.h>struct XP{ char name[23]; int sum;};struct XP *Name(struct XP *p,int *sum){ int i; printf("请输入选票人数:\n"); scanf("%d",sum); p=(struct XP*)malloc(*sum*sizeof(struct XP));.原创 2022-03-25 00:23:19 · 190 阅读 · 0 评论 -
C语言结构体之选票系统
#include<stdio.h>#include<string.h>struct XP{ char name[23]; int sum;};int main(){ int point; struct XP arry[3]; struct XP Max; struct XP Min; int len=sizeof(arry)/sizeof(arry[0]); int qp=0; int i; for(i=0;i<len;i++){ .原创 2022-03-24 00:46:20 · 1652 阅读 · 0 评论 -
assert 断言函数的使用
assert 函数是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为 FALSE (0), 程序将报告错误,并终止执行。如果表达式不为 0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。简单来说是为了判断程序错误而增加的一条指令它和普通不同的是,它会向终端发送一条错误的信息,也就是用户定义的信息。1.首先使用需要引入库函数<assert.h>2.格式:assert(判断原创 2022-03-23 03:35:15 · 345 阅读 · 0 评论 -
各种指针的定义2和悬挂指针
一个整型数: int a;一个指向整型数的指针: int *a;一个指向指针的指针,它指向的指针指向一个整型数: int **a;一个有10个指针的数组,每一个指针指向一个整型数: int *a[10];一个指向有10个整型数的数组的指针: int(*a)[10];一个指向指针的指针,被指向的指针指向一个有10个整型数的数组: int(**a)[10];一个指向数组的指针,该数组有10个整形指针: int *(*a)[10];一个指向函数的指针,该函数有一个整形参数并放回一个整型原创 2022-03-23 03:23:37 · 127 阅读 · 0 评论 -
链表尾插法
#include<stdio.h>#include<stdlib.h>struct Test{ int data; struct Test *next;};void printLink(struct Test* head){ struct Test *point; point=head; while(point != NULL){ printf("%d ",point->data); point=point->next; } p原创 2021-10-17 02:05:36 · 59 阅读 · 0 评论 -
typedef的用法
typedef的用法typedef作为C语言的关键字,作用是为一种数据类型定义一个新的名字。这里的数据类型包括内部数据结构(int,char等)和自定义的数据类型(struct等)和struct来匹配为了代码编写简洁和普通类型匹配,通过名字来获取一些信息。格式:typedef unsigned char u_int8;typedef unsigned short int u_int16;typedef unsigned int u_int32;typedef搭配结构体使用typede原创 2021-03-11 00:09:01 · 1104 阅读 · 1 评论 -
C语言结构体大小计算方式
struct s1{char ch1; //1char ch2; //1int i; //4};遵循结构体运算法则第一条,偏移量必须是当前成员的大小的整数倍,逻辑漂移2,所以该结构体的大小为8个字节;struct s2{char ch1; //1+3int i; //4char ch2; //1+3};结构体大小必须是所有成员的大小的整数倍struct s3{char ch;int i;char str[10];};结构体大小必须是所有成员的大小的整数倍(...原创 2021-10-13 02:41:43 · 310 阅读 · 0 评论 -
C语言字符串自写函数strcpy、strncpy、strcat、strcmp
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>/*自写函数拷贝*/char* mystrcpy(char* p, char* p1){ if (p == NULL & p1 == NULL) { return NULL; } while (*p1!='\0') { *p++ = *p1++; }}/*自写函数选择性拷贝*/char* mystrncpy(char* p, char* p1,int siz原创 2021-10-12 02:35:50 · 144 阅读 · 0 评论 -
C语言字符串字写API gets、memset、strlen
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void myputs(char* p){ while (*p != '\0') { putchar(*p++); } putchar('\n');}/*自主获取*/void mygets(char* p){ if (p == NULL) { printf("非法内存!\n"); } while (*p=getchar()) { if (*p == '\原创 2021-10-12 02:14:02 · 72 阅读 · 0 评论 -
C语言自写函数字符串puts
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>void myputs(char* p){ while (*p != '\0') { putchar(*p++); } putchar('\n');}int main(){ char* p = "chen"; myputs(p); return 0;}原创 2021-10-12 01:40:36 · 170 阅读 · 0 评论 -
C语言各种指针的定义
各种指针的定义:1.一个整形数: int a;2.一个指向整形数的指针: int *a;3.一个指向指针的指针,它的指向的指针指向一个整形数: int **a;4.一个有10个整形数的数组: int a[10];5.一个有10个指针的数组,每个指针指向一个整形数: int *a[10];6.一个指向有10个整形术的数组的指针: int (*a)[10];7.一个指向指针的指针,被指向的指针指向一个有10个整形数的数组: int(**a)[10];8.一个指向数组的指原创 2021-10-10 02:32:36 · 5584 阅读 · 0 评论 -
C语言函数指针
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int* socrrr(int a, int(*p)[4]){ int* score; score =(int *)(p + a); return score;}int main(){ int a[3][4] = { {50,60,99,85}, {70,60,50,90}, {60,40,60,80} }; int* pos; int score;原创 2021-10-09 14:43:23 · 58 阅读 · 0 评论 -
C语言函数指针数组
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>/*函数指针数组*/int minm(int a, int b){ return a < b ? a : b;}int maxx(int a, int b){ return a > b ? a : b;}int summ(int a, int b){ return a + b;}int main(){ int a = 10; int b = 2原创 2021-10-09 01:35:22 · 95 阅读 · 0 评论 -
C语言函数版指针数组逆置
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>/*指针数组逆置*/void iint(int *p, int len){ int i; printf("请输入五个数:\n"); for (i = 0; i < len; i++) { scanf("%d", p++); }}void pprint(int *p,int len){ int i; for (原创 2021-10-06 22:59:42 · 292 阅读 · 0 评论 -
C语言函数求最大值且所在的下标
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void iint(int a[], int len){ int i; printf("请输入10个数:\n"); for (i = 0; i < len; i++) { scanf("%d", &a[i]); }}int maxx;int maxxof(int a[], int len){ int i;原创 2021-10-06 00:29:36 · 1726 阅读 · 0 评论 -
C语言用递归调用实现阶乘
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int getjc(int a){ int jc; if (a>=17) { printf("阶乘越界!!\n"); exit(-1); } if (a == 1) { jc = 1; }else{ jc = getjc(a - 1) *a; } return jc;}int main(){原创 2021-10-04 12:33:14 · 470 阅读 · 0 评论 -
C语言递归函数
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int getage(int a){ int age; if (a == 1) { age = 10; }else{ age = getage(a - 1) + 2; } return age;}int main(){ int ret; int a; printf("请输入第几个学生的年龄:\n"); scanf("%d", &a); ret原创 2021-10-04 01:50:13 · 62 阅读 · 0 评论 -
C语言选择排序
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>/*选择排序从大到小*/int main(){ int i; int j; int temp; int array[5]; printf("请输入5个数字: \n"); for (i = 0; i < 5; i++) { scanf("%d", &array[i]); } for (i = 0; i < 5 - 1; i++) { for (原创 2021-10-02 23:21:57 · 54 阅读 · 0 评论 -
C语言冒泡排序
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){ int i; int j; int temp; int array[5]; printf("请输入5个数字: \n"); for (i = 0; i < 5; i++) { scanf("%d", &array[i]); } for (i = 0; i < 5 - 1; i++) { for (j = 0; j &l原创 2021-10-02 22:16:02 · 55 阅读 · 0 评论 -
C语言斐波那契
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){ int i; int arr[30]; int ofsize; ofsize = sizeof(arr) / sizeof(arr[0]); arr[0] = 0; arr[1] = 1; for (i = 2; i < ofsize; i++) { arr[i] = arr[i - 1] + arr[i - 2]; }原创 2021-10-02 18:31:25 · 61 阅读 · 0 评论 -
C语言水仙花数
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){ int i; int m; int a; int b; int c; for (i = 100; i < 1000; i++) { a = i %10; b = i /10%10; c = i /100; if (a * a * a + b * b * b + c * c * c == i) { printf("水仙花数原创 2021-10-02 00:50:46 · 61 阅读 · 0 评论 -
输入两个数,求最大公约数和最小公倍数
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main(){ int a; int b; int c; int m; int t; printf("请输入两个数:\n"); scanf("%d%d", &a, &b); if (a < b) { t = a; a = b; b = t;原创 2021-10-02 00:10:58 · 944 阅读 · 0 评论 -
puts和printf的区别
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>/*跟printf区别:1.可以自动换行2.printf可以自由花样输入,puts输出一个字符串,getchar获取一个字符putchar输出一个字符*/int main(){char c;puts(“请输入一个字符”);c = getchar();puts(“你输入的字符是:”);putchar©;return 0;}...原创 2021-09-24 17:48:04 · 465 阅读 · 0 评论 -
scanf的用法
scanf格式中有什么字符,输入的时候也要输入。例:scanf(“a=%d”,&n);输入应该输a=整数原创 2021-09-24 16:50:42 · 139 阅读 · 0 评论 -
链表修改指定节点
#include<stdio.h>struct Test{ int data; struct Test *next;};void printLink(struct Test* head){ struct Test *point; point=head; while(point != NULL){ printf("%d ",point->data);原创 2021-03-17 18:55:18 · 220 阅读 · 0 评论 -
链表头插法
#include<stdio.h>#include<stdlib.h>struct Test{ int data; struct Test *next;};void printLink(struct Test* head){ struct Test *point; point=head; while(point != NULL){ printf("%d ",point->data); point=point->next; } p原创 2021-03-17 18:45:07 · 128 阅读 · 0 评论 -
统计链表节点及链表查找
#include<stdio.h>struct Test{ int data; struct Test *next;};void printLink(struct Test* head) /*打印*/{ struct Test *point; point=head; while(point != NULL){ printf("%d ",point->data);原创 2021-03-17 18:42:18 · 129 阅读 · 0 评论 -
链表删除指定节点
#include<stdio.h>#include<stdlib.h>struct Test{ int data; struct Test *next;};void printLink(struct Test* head){ struct Test *point; point=head; while(point != NULL){ printf("%d ",point->data); point=point->next; } p原创 2021-03-17 18:37:17 · 168 阅读 · 0 评论 -
链表从前方插入节点
#include<stdio.h>struct Test{ int data; struct Test *next;};struct Test* insertFromfor(struct Test *head,int data,struct Test *new){ struct Test *p=head; if(p->data==data){ new->next=head; return new; } while(p->next!=NULL)原创 2021-03-17 18:33:42 · 84 阅读 · 0 评论 -
链表从后方插入节点
#include<stdio.h>struct Test{ int data; struct Test *next;};int insertFromBehind(struct Test *head,int data,struct Test *new){ struct Test *p=head; while(p!=NULL){ if(p->data==data){ new->next=p->next; p->next=new;原创 2021-03-17 18:24:39 · 123 阅读 · 0 评论 -
指针
指针无类型指针 不知道指向的空间是什么属性函数指针 定义:void (*p)()存放的是函数的地址数组指针 定义:*p[2] 指向某种类型数组的指针指针数组 定义:(*p)[2] 好多变量地址的集合 是一个数组,数组的每一个元素是指针 好多指针放在一起...原创 2021-03-12 19:44:34 · 55 阅读 · 0 评论