B站嵌入式C语言笔记

switch(a):{
case 1:
case 2:
}
a 是整形数字
//***************************************************************************************************************************************
for 次数
while 条件
do while 先做再while
//***************************************************************************************************************************************
continue break 结束循环
goto
//***************************************************************************************************************************************
类型数据符:资源大小 资源在哪里(位置)
针对内存中可读,可写的地区
默认1.auto char a;自动变量在可读可写区域中 a在栈空间
2.register int a ;限制变量在寄存器上的修饰 加速访问 CPU直接处理寄存器大于访问内存
#include <stdio.h>
int main(){
register int a;
a=0x10;
printf(“the a is %d\n”,a);
return 0;
}
//***************************************************************************************************************************************
static 静态
应用场景:修饰三种数据:
1)函数内部变量
int fun()
{
int a ;=>static int a;
}
2)全局变量
int a ;
=>static int a;
int fun(){
}
3)函数
int fun ===>static int fun();
//***************************************************************************************************************************************
外部申明
只读常量:const int a=100;内存泄漏
//***************************************************************************************************************************************
volatile:不优化变量
int a = 100;
while(100)
fun();
f1:LDR R0 ,[a]
f2:CMP R0,#100
f3:JMPeq f1
f4:fun() 如果a的值是由外部来修改,编译器优化后会跳过f1对于内存的读取指令,从而出错

//***************************************************************************************************************************************
int a = b 100;乘法需要CPU多个周期,CPU性能不支持
0%3=3 1%3=1 2%3=2
n%m=res[0-m-1]取一个范围的数,
eg.得到一个1-100以内的数字(m%100)+1
eg.得到M进制的一个个位数、
//
**************************************************************************************************************************************
##逻辑运算
|| &&
!逻辑取反 对比位运算中的取反~
int a=0x0;
if(!a){}而位运算中取反~a a=0xffff
//
***********************************************************************************************************************************

位运算

左移: 空位补0

乘法2 二进制下的位移
m<<1; m
2
m<<2;m4
m<<n;m
2^n
-1*2 -2;
1000 0001
反码:符号位不变其余取反
补码:符号位不变,其他位取反+1

1111 1111=====-1

右移

最高位和符号变量有关
int a ; a>>n 最高位填逻辑值 ·1111111
unsigned int a ; a>.n ;直接补0
//***************************************************************************************************************************************
& | 0
a&0xff00,屏蔽低8bit A&1——>A取出
屏蔽低8bit,取出高8bit
&:清零器
|:保留 A|1====1,设置为高电平的方法

设置一个资源为bit5为高电平,其他位不变
int a;
a=a|10000 或者采用左移的方式a=(a|(0x01<<5)); 0x01左移5位,变成10000再或保留了原先的前四位,同时保证第5位
a=(a|(0x01<<n)) 第n位设置为高电平

a|=(0x01<<n)
清除第5位
int a;
a=a&01111 31 整形常量32位 4个字节所以不可以会破坏高位的数据
a=a&(~(0x01<<5)) 即当想要第n位清零时 a=a&(~(0x01<<n))
即 a&=(~(0x1<<n))

a|=(0x01<<5);//写入第5位
a&=(~(0x01<<5));//清除第5位

异或
1^1=0;
1^0=1;
数据交换
a=a^b
b=a^b
a=a^b
//***************************************************************************************************************************************

~(0xf0) 1111 0000 这是16进制,只有8位
32位 0xffff ff0f 这是16进制 ,32位 32位要有8个数据
//***************************************************************************************************************************************
想把456位设置为101 0000 0000 a=a|(0x5<<4) 易犯错误 101写成16进制0x5而不是0x101,这里是2进制改成16进制
a=a&~(0x07<<4) a=a|(0x5<<4)

1111 1111
0000 0111
0111 0000
1000 1111 先清除 456位 再写入对应数据
//***************************************************************************************************************************************

赋值符号

前面定义的符号不具备更新能力 =
->地址访问 .变量访问
//***************************************************************************************************************************************

C语言内存空间的使用

1GB 2^N
2^10 1K
2^20 1M
2^30 1G
2^32 4G
32 位指针大小为4个字节

#include <stdio.h>
int main(){
	
	int *p1;
	char *p2;
	
	printf("pl is%d\n,p2 is %d\n",sizeof(p1),sizeof(p2));
	
	return 0;
	

	 
}

指针指向内存空间一定要保证合法性,即可以读也可以写

%x读取16进制
%s8个进制读取

const 常量 、只读
在这里插入图片描述

#include <stdio.h>
int main(){
	
char *p ="hello world!\n";

printf("the one is %x\n",*p);
*p='a'//""
printf("the hh %s\n",p);

	 
}

不可以修改p双引号为const

//针对二级指针
p[m]==NULL--->//结束了

在这里插入图片描述
在这里插入图片描述
argv 就是小圆
*argv就是矩形中的椭圆
**就是要表示的输入参数
argc 就是程序初始化的一个计数参数
argv[i]=*argv

int fun(char **arvg)
{
	int i=0;
	while(arvg[i]!=NULL){
		printf("the world is %s" ,arvg[i]);
		i++;
	}
	return 0;
	//arvg就是小圆针对字符串的地址,arvg[i]=*arvg,就是指针这里也就是因为还要对*arvg的下一层做运算,取二维地址
}

//***************************************************************************************************************************************

数组

//按照标签逐一处理
定义一个空间
1.大小
2.读取方式
数据类型 数组名[m] m建议符 数组越界

char buf[100];
buf="hello world"//不可以数组名是常量

a++不可以即数组不可以与赋值=一起用

//按照标签逐一处理
int a[10];[0--9]
a[0]=xx;
a[1]=yy
int a[10]={10,20,30}<====>a[0]=10,a[1]=20,a[2]=30
char buf[10]={'a','b','c'};

1、buf当成普通内存看
2、buf当成字符串来看 :字符串的重要属性:结尾有个’/0’

//这里有四个字节包括'\0'
char buf[10]={'abc'};
char buf[10]="abc"//最简单
char buf[]="abc";
char *p='abc'

两者不同的原因
char buf[10]=‘abc’;//最简单
buf[2]=‘e’;√

char *p=‘abc’;
p[2]=‘e’;×原因是p代表的是地址
数组中的赋值相当于是字符串常量复制一次到数组buf中
下面是把当前字符串对应的地址给指针p

数组空间的初始化2

数组空间的初始化3

字符空间
ASCII码编码
%s abc ‘a’
\0作为结束字符
非字符空间
数据采集0x00-0xff(没有标签关系 )
char buf[10];----->string(字符)
unsigned char buf[10]---->数据
拷贝三要素
1.src
2.dest
3.number注意数据的大小和数据类型是否匹配

int buf[10];
int sensor_buf[10];
memcpy(buf,sensor_buf,10*sizeof(int));`

unsigned char buf[10];
unsigned char sensor_buf[100];
memcpy(buf,sensor_buf,10*sizeof(unsigned char));

指针数组的概述

int a[100];
char * a[100];
int b;
sizeof(b)
sizeof(a)=100*sizeof(int),对于a的大小是其数组申请的大小同时每块大小对应的字节数

char **a;
*a代表数组盒子 **a表示数组盒子中存储的东西
a代表数组盒子的地址

数组名的指针保存

定义一个指针,指向int a[10]的首地址 int *p1=a;
定义一个指针,指向int b[5][6]的首地址 int (*p)[6 ];
而**p只是一个地址的地址存储器,而二维数组读取时是一行一行读取
int *p[6];

int a[10];  int *p=a;
int b[5][6]; int (*p)[6]=b;
int c[2][3][4]; int (*p)[3][4]=c;

保存地址必须在定义的时候采用指针用修改的所以加()

结构体

字节对齐

最终结构体的大小是4的倍数
结构体里顺序不同,大小也不同

内存分布思想概述

在这里插入图片描述
在这里插入图片描述

  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值