C语言加强篇——(1)学习笔记 之 变量、指针、关键字

C语言加强篇——(1)学习笔记 之 变量、指针、关键字,第1张

系列文章目录

C语言加强篇——(1)学习笔记 之 变量、指针、关键字
C语言加强篇——(2)学习笔记 之 结构体、结构体指针、函数指针


文章目录
  • 系列文章目录
  • 前言
  • 一、变量和指针
  • 二、常见关键字
    • 1.关键字:volatile
    • 2.关键字:const
    • 3.关键字:static、extern
  • 小结


前言

要深入学习单片机、RTOS等,就需要掌握ARM架构、栈、指针、链表等知识。


学习C语言干货推荐:菜鸟教程
本专栏文章使用两个口诀,来深入学习C语言,通俗易懂。

这两个口诀就是:

  1. 变量变量,能变,就是能读能写,必定在内存里。

  2. 指针指针,保存的是地址,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语言的学习请持续关注本专栏。


学习百问网资源总结笔记。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/662108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存