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; m2
m<<2;m4
m<<n;m2^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的倍数
结构体里顺序不同,大小也不同
内存分布思想概述