注:后续再整理
/*
volatile :防止优化内存地址
char *p
volatile char *p;只与硬件有关
typedef :将复杂的地址简单化
类型+变量名称 :利用typedef见名知义;
指针运算符加减标签操作:
指针:
指针的加法减法运算,实际上是加减位,单位的大小可以使用sizeof(p[0])
p++ p–:更新地址
[]的使用:
变量名[n]:n是ID号,地址内容的标签访问方式
p+n :是地址,*(p+n):这个才是标签中的内容
p[n]:标签中的内容,取出标签里的内存值
指针访问越界问题:const 可以通过越界的方式被改变值
*/
/*指针的本质:存放地址的盒子;
指针逻辑运算符操作:== != >= <=
1、跟一个特殊值进行比较:
宏:NULL 就是0
2、指针必须是同类型的比较才有意义
多级指针:
数组的定义:定义一个空间
1、大小
2、读取方式
数据类型 数组名[m] :m的作用域是在申请的时候
数组名:名牌号,相当于标签;数组名是一个常量符号,一定不要放到=的左边
数组的赋值:逐一处理
数组空间的初始化:空间的第一次赋值,初始化操作。
C语言本身,CPU内部本身一般不支持空间和空间的拷贝;
int a[10]={10,20,30} =>等效于 a[0]=10 a[1]=20 a[2]=30 其余默认是0或者是随机值
数组空间的初始化和变量的初始化本质是不同的,尤其在嵌入式裸机开发中,空间的初始化往往需要
库函数的辅助;
char buf[10]={‘a’,‘b’,‘c’}
char buf[10]={“abc”} 自动加’\0’
char buf[] = {“abc”} //4个
buf当做普通内存来看,没有问题
buf当做一个字符串来看,最后加一个’\0’ 或者 0
第二次内存的初始化->赋值:逐一处理
字符拷贝函数的原则:内存空间和内存空间的逐一赋值功能的一个封装体,一旦
空间中出了0这个特殊值,函数就即将结束。
strcpy:不同的CPU有不同的效果;结尾:自带’\0’
strncpy:
字符空间:ASCALL编码来解码的空间=》给人看 %s,’\0’作为结束标志
非字符空间:数据采集,只管逐一拷贝,结束标志在哪? 只能定义个数
拷贝三要素:
1、src 2、dst 3、个数
memcpy(dst,src.n*sizeof(int))
指针数组:
char *a[100] VS char **a;
43未听
结构体:字节对齐===》提高效率,希望牺牲一点空间换取时间的效率;
#include “stdio.h”
struct abc{
int a;
char b;
}var;
int main(void)
{
printf("%d\n",sizeof(var));//输出8;结构体默认是4的倍数
return 0;
}
函数的使用:
*/
/*
内存分配的形式:
内存的属性:
1、大小
2、在哪里?
编译-汇编-链接-
内核空间 应用程序不许访问
栈空间 局部变量
运行时的堆空间 malloc
只读数据段 RW
代码段 code
*/
/*
修饰符的使用总结:
static:
1、修饰局部变量
2、修饰全部变量
3、修饰函数变量
*/
/*#include “stdio.h”
int main(void)
{
int a;
a = 0x10;
printf("%p\n",&a);//%p看地址
printf("%p\n",main);//0019FF2C 00401005
return 0;
}*/