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

系列文章目录

C语言加强篇——(1)学习笔记 之 变量、指针、关键字
C语言加强篇——(2)学习笔记 之 结构体、结构体指针、函数指针
C语言加强篇——(3)学习笔记 之 链表的增、删、改、查



前言

要深入学习单片机、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语言的学习请持续关注本专栏。

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

本专栏文章:
C语言加强篇——(1)学习笔记 之 变量、指针、关键字
C语言加强篇——(2)学习笔记 之 结构体、结构体指针、函数指针
C语言加强篇——(3)学习笔记 之 链表的增、删、改、查

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C语言是一种广泛应用于计算机科学和软件开发的编程语言。它具有强大的功能和灵活性,适用于开发各种类型的应用程序。 C语言专题精讲是一个对C语言进行深入学习和讲解的系列文章或课程。它汇总了C语言相关的重要知识点和技巧,旨在帮助学习者更好地理解和运用C语言。 这个专题中的笔记涵盖了C语言的各个方面,包括基本语法、数据类型、运算符、流程控制、函数、数组、指针、结构体、文件操作等。通过系统性的学习和总结,这些笔记可以帮助学习者逐步掌握C语言的核心概念和常用技巧。 在这个专题中,学习者可以学到如何编写简单的C程序,如何使用变量和运算符进行计算,如何使用条件和循环语句控制程序流程,如何使用函数进行代码的模块化,如何使用数组和指针进行数据的处理,如何使用结构体组织复杂数据,如何进行文件的读写等等。 C语言专题精讲的目的是帮助学习者全面、深入地了解C语言的各个方面,并能够独立编写和调试简单到中等难度的C程序。通过反复实践和练习,学习者可以逐渐提高自己的编程能力,并为进一步学习更高级的编程语言打下坚实的基础。 总之,C语言专题精讲笔记汇总是一份重要的学习资料,可以帮助学习者系统地学习和掌握C语言的基础知识和常用技巧,为他们未来的编程之路打下坚实的基石。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值