嵌入式C语言 第二部分

这篇博客深入探讨了C语言中的指针概念,包括volatile关键字的作用、typedef简化复杂地址、指针运算及数组操作。同时,文章讲解了指针逻辑运算符、多级指针、数组的定义与赋值、初始化以及内存分配的形式。此外,还提到了结构体的字节对齐优化和函数使用。最后,讨论了内存的属性,如栈空间、堆空间和只读数据段。
摘要由CSDN通过智能技术生成

注:后续再整理

/*

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;
}*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值