- 博客(41)
- 收藏
- 关注
转载 时钟
1、系统时钟SYSCLK在STM32F407中,除了一些特定的时钟(例如,USB OTG FS时钟,I2S时钟)外,系统所有外设的时钟均是通过SYSCLK来提供的。也就是说我们经常用到的外设时钟,都是通过SYSCLK分频得到的。下面是和SYSCLK相关的时钟树的图。由图中可以看到,SYSCLK的来源主要有三个。l HSI 振荡器时钟l HSE 振荡器时钟l&...
2018-11-28 20:46:21
823
原创 typedef的使用
typedef的使用#include <stdio.h>struct Test{ int a;};//定义一个结构体变量struct Test obj;//给struct Test2类型起一个别名叫Test2typedef struct Test2{ int a;}Test2;Test2 tmp;//给struct Test2int main...
2018-11-14 22:18:01
280
原创 枚举的使用
枚举的使用#include &lt;stdio.h&gt;/*#define pink 0#define red 1#define green 2#define white 3#define black 5#define yellow 6*///enum是关键字//里面的成员是一个标识符,枚举常量//第一个成员如果没有赋值,默认为0,下一个成员比上一个多1//枚举类型...
2018-11-14 22:16:32
274
原创 共用体(联合体)
共用体(联合体)#include <stdio.h>union Test{ unsigned char a; unsigned short b; unsigned int c;};int main(int argc, char const *argv[]){ //1、结构体的大小可以简单认为成员大小的累加 //2、共用体的大小为最大成员的大小 printf(...
2018-11-14 22:14:42
2411
原创 成员变量指针指向 文字常量区、堆区空间、栈区空间
成员变量指针指向 文字常量区、堆区空间、栈区空间#include &amp;lt;stdio.h&amp;gt;#include &amp;lt;string.h&amp;gt;#include &amp;lt;stdlib.h&amp;gt;struct Student{ int age; //char name[50]; char *name; int score;};//成员变量指
2018-11-14 22:14:06
551
原创 指针指向堆区空间
指针指向栈、堆区空间#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;struct Student{ int age; char name[50]; int score;};int main(int argc, char const *argv[]){ //定义一个结构体类型指针 struct Student *p; ...
2018-11-14 22:04:05
1038
原创 同类型的结构体如何赋值 以及 结构体的值传递和地址传递的区别
同类型的结构体如何赋值 以及 结构体的值传递和地址传递的区别同类型结构体变量赋值#include &lt;stdio.h&gt;struct Student{ int age; char name[50]; int score;};int main(int argc, char const *argv[]){ int a = 10; int b; //1、把a的值给...
2018-11-14 21:55:56
4469
原创 结构体数组和结构体的嵌套
结构体数组和结构体的嵌套结构体数组#include &amp;lt;stdio.h&amp;gt;struct Student{ int age; char name[50]; int score;};int main(int argc, char const *argv[]){ //结构体数组的初始化 struct Student a[5] = { {18, &quot;mike&quot;,...
2018-11-14 21:45:13
4928
原创 14、结构体的基本使用
结构体的基本使用#include <stdio.h>#include <string.h>//定义一个结构体类型//1、struct是关键字//2、合起来才是结构体类型//3、结构体内部定义的变量不能直接赋值//4、结构体只是一个类型,没有定义变量前,就是没有分配空间。没有空间,就不能赋值struct Student{ int age; char n...
2018-11-14 21:42:15
241
原创 内存操作函数
内存操作函数1、memset() 主要用于清0/*#include <string.h>void *memset(void *s, int c, size_t n);功能:将s的内存区域的前n个字节以参数c填入参数: s:需要操作内存s的首地址 c:填充的字符,c虽然参数为int,但必须是unsigned char , 范围为0~255 n:指定需要设置的大...
2018-11-09 17:29:44
366
原创 C语言全局变量的缺陷 和 全局变量建议的写法
C语言全局变量的缺陷 和 全局变量建议的写法C语言全局变量的缺陷#include <stdio.h>int a;int a;int a = 0;//定义,其他是声明int a;int a;//有1次是定义,有3次是声明int c;int c;int c;int c;//1、如果定义一个全局变量,没有赋值(初始化),无法确定是定义,还是声明//2、如果定...
2018-11-09 17:22:49
2344
原创 指针对堆栈的使用
指针对堆栈的使用指针指向栈区指针指向堆区内存泄漏:动态分配了空间,不释放内存污染:非法使用内存堆区空间越界:#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#include&lt;string.h&gt;int main(void){ char *p = NULL; p = (char *)malloc(0);//分配的空...
2018-11-09 10:59:29
820
原创 13、内存管理—变量作用
内存管理—变量作用一、普通局部变量include &amp;lt;stdio.h&amp;gt;int main(int argc, char const *argv[]){ int a = 10; if(1) { int a = 11; //就近原则 printf(&quot;a = %d\n&quot;, a);//a = 11 } //1、if()的a只能在if{}中使用 //2、离开if...
2018-11-09 10:44:24
253
原创 main函数参数说明
main函数参数说明字符指针数组#include <stdio.h>//void fun(int a[10])//void fun(int a[])void fun(int *a){}//void print_array(char *p[100], int n)//void print_array(char *p[], int n)void print_arr...
2018-11-07 15:03:40
476
原创 文字常量区相关知识点说明
文字常量区相关知识点说明文字常量区#include &lt;stdio.h&gt;void fun(char *tmp){ *tmp = 'a';//err}int main(int argc, char const *argv[]){ char *p = NULL;//p是变量 "hello mike";//字符串常量,首元素地址 p = "hello mike";/...
2018-11-07 15:03:12
1526
原创 字符串拷贝
字符串拷贝字符串拷贝函数#include &lt;stdio.h&gt;void my_strcpy(char *dst, char *src){ int i = 0; while( *(src+i) != '\0') { *(dst+i) = *(src+i); i++; } //结束符 *(dst+i) = 0;}int main(int argc, cha...
2018-11-07 15:00:54
1333
原创 字符指针
字符指针字符串打印说明%s#include &lt;stdio.h&gt;int main(int argc, char const *argv[]){ char str[] = "hello mike"; //1、%s,从首元素开始打印,直到结束符位置 //2、%s,操作的是指针所指向的内容 printf("str = %s\n", str); //2、str是首元素地址...
2018-11-07 15:00:00
316
原创 怎么用函数返回变量的地址
怎么用函数返回变量的地址我们先分别讨论一下,返回局部变量地址 和 返回全局变量地址返回局部变量地址#include &lt;stdio.h&gt;//这是错误的示范,不能返回局部变量的地址int *fun(){ int a; return &amp;a;}int main(int argc, char const *argv[]){ int *p = NULL; ...
2018-11-07 14:58:49
5974
3
原创 形参中的数组
形参中的数组数组在形参中有3种不同的表达方式#include <stdio.h>//1、形参中的数组,不是数组元素,它是普通的数组指针变量//2、形参数组:int a[100000],int a[], int *a对编译器而言,没有任何区别。编译器都是当做int *处理//3、形参中的数组和非形参数组区别:形参中的数组时指针变量,非形参数组就是数组//void print...
2018-11-07 14:57:51
4394
1
原创 值传递和地址传递
值传递和地址传递指针的优势体现在函数上,如果只是普通的值传递,那么变量的值将不会改变。而地址传递,可以通过操作指针直接访问地址去改变变量。#include &lt;stdio.h&gt;void swap1(int m, int n);void swap2(int *m, int *n);int main(int argc, char const *argv[]){ int a =...
2018-11-07 14:56:46
435
1
原创 指针数组
指针数组指针数组,它是数组,每个元素都是指针数组指针,它是指针,指向数组的指针#include <stdio.h>int main(int argc, char const *argv[]){ int a[3] = {0, 1, 2}; //指针数组,它是数组,每个元素都是指针 int *p[3]; p[0] = a; p[1] = a+1; p[2] = a+...
2018-11-07 14:54:23
153
原创 const修饰的指针变量
const修饰的指针变量#include <stdio.h>int main(){ //1、指针变量 //2、指针所指向的空间 int a = 10; int *p1 = &a; *p1 = 100;//等价于操作a,*p1操作指针所指向的空间 p1 = NULL;//操作指针变量 //cons...
2018-11-02 21:46:58
187
原创 万能指针
万能指针#include <stdio.h>int main(){ //1、不可以定义void类型的普通变量,不能确定类型 //void a;//err //2、可以定义void *变量,void *指针也叫万能指针 //3、void *可以指向任何类型的变量,使用指针指向内存时,最好转换他本身的指针类型 void *p = NULL;...
2018-11-02 21:46:14
1798
1
原创 12、指针和数组
指针和数组[]不是数组的专属注意:其实数组就是指针,指针也是数组#include <stdio.h>int main(){ int a = 10; int *p = &a; //通过指针间接操作a的内存 *p = 111; printf("a = %d\n", a); printf("*p = %d...
2018-11-02 21:44:03
234
原创 11、指针
指针指针的概述1、内存区的每一个字节都有一个编号,这就是“地址”。2、指针的实质就是内存“地址”。指针就是地址,地址就是指针。3、指针是内存单元的编号,指针变量时存放地址的变量。指针的定义和使用#include &lt;stdio.h&gt;int main(int argc, char const *argv[]){ //1、指针也是一种数据类型 //p是一个变量,p...
2018-11-02 16:05:55
275
原创 10、函数声明,分文件编译
函数声明,分文件编译return 和 exit 的区别return的作用:中断函数,中断main,程序就结束1、return主函数(main),程序结束2、return其他函数,程序不结束exit();//结束整个程序,结束进程实验一个函数,功能和strlen一样的,int my_strlen(char str[]);#include <stdio.h>//1、编译器...
2018-11-02 16:04:27
263
原创 字符处理函数总结大全
字符处理函数总结大全gets()、fgets()#include <stdio.h>/************************#include <stdio.h>char *gets(char *s);功能:从标准输入读入字符,并保存到s指定的内存空间,直到出现换行符或读到文件结尾为止。参数: s:字符串首地址返回值: 成功:读入的字符串 失败...
2018-11-01 14:06:03
482
原创 scanf()的使用注意、scanf() printf()格式字符
scanf()的使用注意、scanf() printf()格式字符#include <stdio.h>int main(int argc, char const *argv[]){ char buf[100] = {0}; printf("请输入字符串:"); scanf("%s", buf);//不需要&, 默认以空格分开 printf("buf = %s...
2018-11-01 13:53:07
523
原创 9、函数
函数函数的分类:库函数、用户定义函数1.函数的定义,就是把之前在main内部的代码换个地方2.函数的定义,类似于厨房做好菜,如果没人点菜,做好的才没有意义函数的定义,只有在用户调用了,才起作用,函数调用类似于点菜1、无参无返回值函数的使用#include <stdio.h>//1、无返回值,用void关键字修饰//2、没有参数,也可用void,或者空//3、第一个vo...
2018-11-01 13:45:15
242
原创 8、字符串数组
字符串数组#include <stdio.h>int main(int argc, char const *argv[]){ //1、C语言没有字符串类型,用字符数组模拟 char a[10]; //2、字符串一定是字符数组,字符数组就不一定是字符串 //3、如果字符数组以字符'\0'('\0'等价于数字0)结尾,那么这个字符数组就是字符串 char b[3] = ...
2018-11-01 13:44:18
209
原创 7、二维数组
二维数组#include &lt;stdio.h&gt;int main(int argc, char const *argv[]){ //1.有多少[]就有多少维 //2.内存中没有多为,都只有一维,多维数组是特殊的一维数组 //3.定义了一个一维数组a[3],这个一维数组有3个元素,每个元素int[4] //4.a[0],a[1],a[2]就是第0、1、2元素的数组 //5....
2018-11-01 13:42:21
280
原创 冒泡排序
冒泡排序冒泡排序原理图#include &amp;lt;stdio.h&amp;gt;int main(int argc, char const *argv[]){ int a[] = {1, -1, 2, -2, 3, -3, 4, -4, 5, -5}; int n = sizeof(a)/sizeof(a[0]); int i = 0; int j = 0; int tmp; p...
2018-10-28 21:11:35
133
原创 数组翻转
数组翻转数组翻转原理图#include &lt;stdio.h&gt;int main(int argc, char const *argv[]){ int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int n = sizeof(a)/ sizeof(a[0]);//元素个数 int i = 0;//首元素下标 int j = n-1;//尾元素下标...
2018-10-28 21:10:36
278
原创 求最值
求最值求数组中的最大值#include <stdio.h>int main(int argc, char *argv[]){ int a[] = {10, -1, 20, 3, 5, 90, 2, 1, 9, 8, 7, 6}; int n = sizeof(a)/sizeof(a[0]); int max = a[0]; int i = 0; for(i = 1...
2018-10-28 21:09:21
286
原创 6、程序流程结构
程序流程结构顺序结构、选择结构、循环结构选择结构if语句 if() _ else if() _ else注意:1、if是一个关键字,if后面有(),if()后面是没有分号 2、()里写得是条件,条件为真,执行if语句,为假不执行 3、if(1)//条件为真 if(-1)//条件为真 if(0)//条件为假 ...
2018-10-28 17:03:19
234
原创 5、输出、输入的使用 强制类型转换
输出、输入的使用 强制类型转换输出使用字符串常量与字符常量的不同'a’为字符常量,“a”为字符串常量‘a’ ‘a’ ‘\0’printf();//%5d,以5个字符输出,没有的字符以空字符填充,默认是右对齐//%05d,以5个字符输出,没有的字符0填充,默认是右对齐//%-5d,以5个字符输出,没有的字符以空字符填充,-代表指定...
2018-10-28 17:02:52
750
原创 volatile类型限定符的作用
int a; a = 1; a = 2; a = 3; a = 4;volatile 防止编译器优化如果没有volatile,有可能编译器会自动优化,不执行a = 1; a = 2; a = 3;会直接执行 a = 4;而对于硬件而言,这是不允许的。那么,这时候volatile就发挥作用了,不允许编译器去优化这几步。...
2018-10-25 22:33:39
273
原创 4、有符号和无符号的区别 数据类型范围 (解释-128是怎么来的) sizeof()关键字
有符号和无符号的区别 数据类型范围(解释-128是怎么来的) sizeof()关键字有符号和无符号的区别1)有符号,最高位是符号位,如果是1代表是负数,如果为0代表为正数2)无符号,最高位不是符号位,是数的一部分,无符号不可能是负数#include <stdio.h>int main(){ unsigned int c = 0x8000007b; pri...
2018-10-25 21:51:50
2155
原创 3、原码 反码 补码 (为什么计算机存储数字以补码方式存储)
原码 反码 补码 (为什么计算机存储数字以补码方式存储)1)存储1字节(8位)大小的数字(char)原码(用户角度):原始的二进制1、用户的数字分为正负数,符号位的存储2、最高位为符号位:0代表为正数,1代表为负数3、1000 0001 左边是最高位,右边是最低位1, +1: 0000 0001 -1: 1000 0001 +0:0000 0000 -0: 1000 00...
2018-10-25 21:50:28
2555
原创 2、进制
进制当前的计算机系统使用的是二进制系统,数据在计算机中主要是以补码的形式存储的。bit(比特) 位byte(字节) 1个字节为8个二进制(8位) 计算机中存储的最小单位是字节1b 1bit,1位1B 1Byte,1字节,8位1k 1024byte1M 1024k1G 1024M1T 1024G1Kb(千位) 1024bit,1024位1KB(千字节) 1024B...
2018-10-21 19:04:00
393
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人