系列文章目录
C语言加强篇——(1)学习笔记 之 变量、指针、关键字
C语言加强篇——(2)学习笔记 之 结构体、结构体指针、函数指针
C语言加强篇——(3)学习笔记 之 链表的增、删、改、查
前言
要深入学习单片机、RTOS等,就需要掌握ARM架构、栈、指针、链表等知识。
学习C语言干货推荐:菜鸟教程
本专栏文章使用两个口诀,来深入学习C语言,通俗易懂。
这两个口诀就是:
- 变量变量,能变,就是能读能写,必定在内存里。
- 指针指针,保存的是地址,32位处理器中地址都是32位的,无论是什么类型的指针变量,都是4字节。
一、变量和指针
直接上示例,从实际现象中学习更容易理解。
int a_test;
char c_test;
int buf_test[100];
int *p;
char *p2;
以上5个变量存储在哪里呢?其所占的内存空间又是多大呢?我们来看一下编译后生成的 .map 文件,里边生成了变量存储的地址以及所占空间大小。下边是map文件截图:
从图中可看出
- int型变量 a_test 存储在RAM中的起始地址为0x20000014,占内存空间 4 个字节。
- char型变量 c_test 存储在RAM中的起始地址为0x20000018,占内存空间 1 个字节。
- int * 型变量 p 存储在RAM中的起始地址为0x2000001c,占内存空间 4 个字节。
- char * 型变量 p2 存储在RAM中的起始地址为0x20000020,占内存空间 4 个字节。
对于整型指针、字符型指针是占 4 个字节,那么其他类型的指针呢 ??
大家有兴趣的可以自己试一下,可以使用C语言运算符 sizeof() 来查看变量的大小。C语言运算符
这是网上对指针的解释:
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
既然存储的是地址,那么32位处理器中地址都是32位的。于是有:
指针也是变量,是变量就存储在内存中,就是32位地址占4个字节。(1个字节等于8位)
二、常见关键字
1.关键字:volatile
volatile : 形容词;不稳定的; 易挥发的; 易变的
解析1:
先看下面一段简单的代码:
int main()
{
int i; //语句1 volatile int i;
i = 1; //语句2
i = 2; //语句3
}
在程序上语句2是可以省略的,这时编译程序时,编译器会自作主张的把语句2给省略掉。
如果我这句语句不希望被优化就可以在语句1前加volatile,告诉编译器不要惹我,我很容易变,我很容易生气,编译器就不把语句2优化掉了。
解析2:
先看变量存储及使用过程:
定义的变量存储在RAM中,在程序运行过程中使用到变量时,CPU将内存中的变量读到内存中,让后对变量进行操作,完成后再写入内存中。
例如在这样的语句中:
int i;
for(i = 0; i < 100; i++)
{
}
不加关键字volatile时,将 i 读到CPU中进行 i++ 直到循环结束,这都是在CPU中完成的。
加关键字volatile时,将 i 读到CPU中进行 i+1 后再写入RAM中完成1次循环,这样操作一直执行100次结束,可想而知完全没有这个必要,而且会增加程序执行时间,程序变得更慢了。
解析3:
当程序在执行过程中需要读取随时可能变化的值时就需要加关键字volatile,例如:
当希望读取GPIO中数据寄存器的值时,该值可能根据外部按键变化而变化,需要加关键字volatile,保证每次CPU读取的值都是GPIO寄存器中的值。
2.关键字:const
const : 名词;常量;常数
关键字 const 修饰常量不能被修改;例如:
/*
定义常量PI , 不能被修改
*/
const float PI = 3.14;
3.关键字:static、extern
static : 形容词;静止的;静态的;
简单的说:其规定了所定义的变量、函数等的作用域。
有 static 修饰的只能作用于本文件,不能被其他文件调用。
extern : 形容词;外部的;外面的;
extern 修饰的函数或者变量可以在其他文件调用。
/*
文件 bsp_led.c 中定义数组
*/
const char * led_buf[] = {"LED1_ON", "LED1_OFF", "LED2_ON" ,"LED2_OFF"};
在其他文件中需要使用数组 led_buf 时需要使用 extern 声明该数组:
方法1:
/*
文件 main.c 中声明数组在其他文件中已经定义
*/
extern const char * led_buf[];
int main(void)
{
printf("%s\n",led_buf[1]);
}
方法2:
/*
文件 bsp_led.h 中声明数组在其他文件中已经定义
*/
extern const char * led_buf[];
/*
文件 main.c 中包含其头文件
*/
#include “bsp_led.h”
int main(void)
{
printf("%s\n",led_buf[1]);
}
两种方法声明都可以,其关键在于 extern 语句。
小结
本文主要讲述变量及指针的存储位置及所占字节大小,常见关键字说明,针对C语言的学习请持续关注本专栏。
学习百问网资源总结笔记。
本专栏文章:
C语言加强篇——(1)学习笔记 之 变量、指针、关键字
C语言加强篇——(2)学习笔记 之 结构体、结构体指针、函数指针
C语言加强篇——(3)学习笔记 之 链表的增、删、改、查