C语言提高_变量_结构体_指针_函数指针_栈的概念(韦东山学习笔记)

一、韦东山-C提高-变量和指针

1、变量和指针口诀

  • 变量,能变,能读能写,一定在内存里
  • 指针保存的是地址,32位机中地址为32位,指针都是4字节(一字节8位)

变量理解:

​ 单片机内存分为两部分——FLASH(程序存储器,只读)和 RAM(内存,动态存储区,可读可写),所以变量一定存放在内存中

​ 且变量还有如下性质:

  • 具有相应的地址(定义变量后,程序运行时会在RAM中开辟一块空间)
  • 不同类型不同大小(根据不同的数据类型,会开辟不同大小的空间,如 int 为 4 字节 ,char 为 1 字节)
  • 地址位数相同(地址都是32位——对32位机来讲)

指针理解:

int *p;
int a = 1;
p = &a;
  • 定义了一个 整型指针类型 的变量 p
  • 在内存中开辟了一块空间来存储这个变量
  • p变量中存放的是一个 4 字节的地址
  • *p 和 p,一个是表示p中存放的地址对应的地址空间内存放的值,一个表示p这个变量所对应空间中存放的地址

2、对于 volatile 的理解

作用:

  • 编译器在编译程序时,会自动进行优化,有些未使用变量会被编译器自动优化
  • 对于没有使用 volatile 定义的变量,有些时候会仅在CPU进行操作,但对于内存未进行写操作,因此对于寄存器必须加上 volatile ,避免CPU只读备份,不读硬件。
    在这里插入图片描述

3、对于 map 文件的理解

  • map文件中查找到的是 全局变量、静态变量
  • 掌握DSP存储器的使用和利用情况,进行存储器优化
  • 更精确的使用 RAM 空间
  • 找出崩溃地址

崩溃地址使用示例:https://www.cnblogs.com/yilang/p/11994448.html

4、KEIL 的调试使用

~工具栏按钮

~找到main.c

~打断点

~运行

~变量a

~Add to watch

~& 出地址

二、韦东山-C提高-sizeof 和 关键字

1、const

  • 不允许修改,存放在FLASH中
  • 定义一个常量

2、sizeof 在课程中的使用

  • 通过sizeof 来测试 *p 占用内存

在课程这一部分,主要还是通过sizeof 来具体理解 变量和指针

3、串口调试

~view

~serial windows

~USRT 1

~运行

4、static

  • 作用域在此文件内

5、extern

  • 可用可不用
  • 表 是 一个外部函数 / 外部变量
  • 可以写在头文件内,也可以写在使用外部变量的 .c 文件内

6、作用域

  • 通过 static 来限制 变量 / 函数的作用域范围
  • 相同的作用域范围内重名会出现冲突

7、补充

​ 即使 使用 static 定义的变量在 主函数之后,也不会使用同名称的全局变量。

三、韦东山-C提高-struct

1、struct

  • 使用 C标准 原有类型,创建了一个新的数据类型
  • 结构体不占用内存空间,定义变量后,结构体变量占用内存
  • 结构体在 面向对象思想中 理解为 封装
  • 结构体组合 在面向对象思想中 理解为 继承

2、内存浪费问题

  • 奇地址 访问一个字节 可以
  • 奇地址 访问四个字节 不可以

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dyWmaCXX-1636713635582)(570671B58838917FBA780198E48238F2.jpg)]

四、韦东山-C提高-变量赋值

1、结构体强制类型转换

wei = (struct person)a;  

2、破坏内存问题

struct person{
    char c;
    char d;
    int age;
};
struct person wei = ('A','B',40);
int *p;
p = (int *)&wei.c;
*p = 'C';
//讲课的时候,这里出现了类型警告,对于类型警告一定要

五、韦东山-C提高-通过指针赋值

1、原理

变量 -> 内存 -> 地址空间 -> 读写

## [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GH6IehSv-1636713676463)(15223D6C0D03AA98084EED1191018E39.jpg)]

六、韦东山-C提高-结构体指针_函数指针

1、结构体指针的使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vs67miJS-1636713676465)(DC5335FC72C951CB88A1773B381B26E5.jpg)]

2、函数指针

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lEgtF6D0-1636713676468)(E63422FF210D1784509B3B0048519AA7.jpg)]

七、韦东山-C提高-链表

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

八、韦东山-C提高-ARM架构和几条汇编指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LoLtyC3M-1636713676472)(654A22B330E38D79A5AFF08E9BFDE212.jpg)]

九、韦东山-C提高-全局变量的初始化和栈的引入

十、韦东山-C提高-局部变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zEhRbHsM-1636713676472)(31B21A776753DF6720DF8A911135CD54.jpg)]

版权声明:本文为CSDN博主「直到遇见你--」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44127810/article/details/121293747

生成海报
点赞 0

直到遇见你--

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

ESP8266 无限重启踩坑

最近做了一个电子墨水屏万年历,在移植屏幕代码时遇到了esp8266无限软复位的问题,如果你的串口打印是以下图片所示,那么恭喜你问题解决了。 造成软复位的原因是因为,程序里有死循环&#xf