一、地址空间的分类
程序运行需要将程序加载到一个地址空间里,根据地址空间是否可写,将地址空间分为两种,一种是可写的,我们将这种地址空间称为可读可写的;还有一种不能写,只能读,将这个地址空间称为只读的地址空间。
二、量的分类(分类规则依赖于地址空间的分类)
程序中有两种量,常量和变量。不管是常量还是变量,都有自己的地址空间。常量的地址空间里的值不能改变,也就是只读的,但变量地址空间里的值是可以改变的,也就是可读可写的。
三、常量和变量的三要素
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值、枚举常量。常量的值在定义后不能进行修改。
C中定义一个变量的时候,必须指定变量的数据类型。什么是数据类型?接下来会讲到。
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,C语言中大小写敏感。
每个变量都有自己的名字、地址编号、和值。这是变量的三要素。
上图中va是变量的名字,200是变量的值,f0fff0000是变量的地址, int是变量的数据类型。到这里,数据类型、地址编号,都懵了。稍等片刻,慢慢解开。程序中如何访问变量的内容呢?首先,通过变量的名字找到变量的地址,然后,根据变量的数据类型,访问变量地址里的内容。这句话标红,那是因为他重要的不得了。
四、地址编号
那么接下来,我们解释地址编号。
地址编号分为两种。一种是物理地址编号,这些主要用在没有操作系统的开发方面。这些地址编号是由机器的生产商已经确定好了的。一种是虚拟地址编号,虚拟就是假的,不存在的。在操作系统层面的开发,使用的都是虚拟地址编号,这些编号是操作系统通过管理底层的物理器件,向程序员提供的一个地址编号,是由操作系统的存储管理子系统完成的,目前大家不必去纠缠是如何形成的,如果感兴趣,可以在系统编程中为大家讲解。目前我们拿32位机给大家讲解地址编号。32位机中,有32根地址线,每根地址线可以取值0或者1。所以,我们就可以有0~4G-1,共4G个地址编号。这些地址编号是线性的、连续的。一个地址编号对应一个字节。也就是说,每个字节都有自己的地址编号。
五、数据类型
在提及到数据类型概念的时候,都是char、short、int、 float、 doulble.. 这样讲解没有问题。这些都是不同的、具体的数据类型。
每个字节都有自己的地址编号,那找到这个地址编号的时候,我是从这个地址编号里一次访问一个字节呢、两个字节呢、还是四个字节呢?这些操作需要做出一个规定,我称之为访问地址空间里数据的方式。比如(开辟)访问1个字节的称为char,2个字节的称为short, 4个字节的称之为int。ok, 这就是数据类型。但除此之外,还有跟char、short、int类型相关的操作。所以,数据类型就是访问地址内容的规则和跟这种类型相关的操作。如果是多个字节的话,那么我们又如何将多个字节编组成我们想要的数据呢?这里涉及到另一个话题,大端和小端。后边详述。
C语言的数据类型分为两种,一种是系统提供的,我称之为原生态的。如char、short、int、float、 double、void、 *类型。另外一种是用户使用原生态的数据类型自定义的数据类型。比如:指针、数组、函数、结构体、枚举、联合 ,搭积木一样。
头脑里画出一个xmind图帮助理解
六、变量的定义和使用
由上述的讲解,现在可以告诉大家如何定义和使用一个变量了。
变量定义的格式如下
数据类型变量的名;
数据类型变量的名=指定变量的初值;
数据类型变量名1, 变量名2, ..
数据类型变量名1=指定变量的初值, 变量名2=指定变量的初值,...
注解
(1)变量命名规则,数字、字母、下划线组成,不能以数字打头。
(2)变量名最好见名知意,尽量不要使用全拼命名变量,给人的感觉太low。
案例
#include<stdio.h>
int main(){
char vc = 'm';
printf("vc=%c\n",vc);
printf("&vc=%p\n",&vc);
return 0;
}
给张图自己理解理解