![轻松学C语言](https://wfqqreader-1252317822.image.myqcloud.com/cover/139/656139/b_656139.jpg)
2.3 变量
在C语言中有常量和变量,变量的值在程序中是可以改变的,变量分为很多种,不同的变量在程序中所使用的范围是不一样的,本节主要介绍变量的声明和定义等内容。
2.3.1 变量的声明和定义
变量代表内存中具有特定属性的一个存储单元,用这个存储单元用来存放变量的值。变量名实际上是一个地址,也就是存放这个变量值的地址。在C语言中要求对用到的所有变量必须进行声明和定义,也就是先定义后使用。声明变量是告诉编译器该变量所使用的标识符,定义是说明该变量的数据类型,编译器根据定义形式,分配对应的内存空间。由于变量的声明和定义同时进行,所以将变量的声明和定义合并称为变量的定义,变量的定义如图2.27所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0037_0003.jpg?sign=1738888445-UiVjF7Wcn8J23aP99nVlNp72QLgpPwDD-0-df40466d228c39ae733a95f91d6308b3)
图2.27 变量的定义
常见的几种变量类型如图2.28所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0037_0004.jpg?sign=1738888445-SYvzAlEqc1YUoC0QGeHBiHbAAj0n6iAm-0-3275d70682d3cefaea0c5472a5c3f2b8)
图2.28 常见的变量类型
下面定义了一个整型(int)变量,如图2.29所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0038_0001.jpg?sign=1738888445-7qVOlhHv44OslEelT2npJEhqak3JPj4l-0-9f3dc7f30669b49edc3777ce7b091f84)
图2.29 一个int变量的定义
如果定义多个同类型变量时可以一次定义,不用单个定义,如图2.30所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0038_0002.jpg?sign=1738888445-QEWRtablKFCipPaL2oCLamN86LESEYyO-0-a982d6f75b7c60540d7f951b4ccd20c5)
图2.30 多变量定义
如果定义多个不同类型的变量时,变量类型相同时可定义在一起,变量的类型不同时分开定义,如下所示。
int a1,a2; char c1,c2;
定义变量时必须使用用户标识符,不能使用关键字。否则会出现如图2.31所示的提示错误。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0038_0003.jpg?sign=1738888445-aV965uYgbHW0UEXY9GbSZKe1AYu44mF9-0-f6cb4eaa6371633dba0d54fb467f353a)
图2.31 提示信息
当计算机在编译时,遇到变量a时,它会去找存储这个变量的对应的一个地址,然后从地址中读取a这个变量的值。具体情况如图2.32所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0038_0004.jpg?sign=1738888445-StIv40YgJA0ikVjZ19RMCAmnL9PIAsSk-0-00d5346f7186792475606c0e93f8860e)
图2.32 对变量的编译过程
一般情况下,变量都是先定义以后再使用的,有时由于特殊情况要在变量定义以前使用,必须借助关键字extern声明变量,形式如图2.33所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0039_0001.jpg?sign=1738888445-1fG80fFwKtu7251wAvkRnl0kiMsxQ0b1-0-c9ee273e2fedd0dba6ee55b8df85c84a)
图2.33 extern声明变量
extern语句的作用是告诉语句该变量是在该程序的其他程序块中完成定义的。
【示例2-1】以下程序是使用extern声明变量的,程序代码和输出结果如图2.34所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0039_0002.jpg?sign=1738888445-v4lMzR3j2Up7FGApEo9HJQmFkDGtSnFI-0-d80f52f16e9af0867dfd8c936867d4e3)
图2.34 extern声明变量
2.3.2 不变的变量——常量
常量就是在程序运行中不可以改变的量。大家以前都学习过常数,并且常数在程序中经常直接出现,例如:
123、3.14159、'a'、"computer"
常量的类型通常有5种:整型、浮点型、字符型、字符串型和符号常量,如图2.35所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0039_0003.jpg?sign=1738888445-TABXaFrWp0assmjys04CtsjJrP3PqNdH-0-d983cf333667c41c08f81cb9238b6250)
图2.35 常量的几种基本类型
为了更好地使用这些常数,我们可以为每一个常数指定一个标识符,以示该标识符表示的常数成为常量。除了可以在程序中直接使用常量,还可以通过关键字 const把一个变量定义为“只读变量”,也就是一个常量,如图2.36所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0039_0004.jpg?sign=1738888445-B0qMS1qPotXwEHfM101BM0SpiLUw6WgQ-0-916691bb7a5f3b8295b9a3c2053d5a0e)
图2.36 const定义常量
定义一个常量时,可以在定义了的一个变量整体的前面加const,如图2.37所示。
如果定义多个同类型的常量,可以一起定义,如图2.38所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0040_0001.jpg?sign=1738888445-xkHPBIpQgcdYoMysOtWKZJDpL1yr2gbi-0-4b85ec64194086bfc8b09ede2ebd7a97)
图2.37 定义常量
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0040_0002.jpg?sign=1738888445-59acQQ5howBAbDAj2qAOZ9H2mDYn16c0-0-5614675b6db3d3f07aa7722315ed5afe)
图2.38 定义多个同类型常量
【示例2-2】以下程序通过关键字const定义了一个int型常量age,如果在main()函数中改变age的值,编译时会产生一个错误。
#include <stdio.h> const int age=20; int main() { age=10; /*这条语句是错误的*/ printf("%d\n",age); /*输出整型常量age*/ return 0; }
编译时会报错:
error C2166: l-value specifies const object Error executing cl.exe.
注意:因为在程序中已经声明了 age是一个整型常量,所以在程序的任何位置都不能改变age的值。把示例2-2中的“age=10;”这条语句删掉,那么程序会成功执行,并且会输出age的值为2。
符号常量是指用一个标识符来代表的常量。
【示例 2-3】以下程序是实现符号常量的简单应用。符号常量相当于宏定义,在程序运行过程中所有标识符都会被对应的常量所代替,如图2.39所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0040_0003.jpg?sign=1738888445-hZId1kVMjvljWnSeHvBcsBXgRDgw5auX-0-f71a9d7410459f0580503140e1846743)
图2.39 符号常量
符号常量是不能被赋值的,否则就会出现错误提示,如图2.40所示。
![](https://epubservercos.yuewen.com/36CD4E/3590313404985601/epubprivate/OEBPS/Images/figure_0041_0001.jpg?sign=1738888445-chey5oFh4IS4N4FcaPyM6xRCgHGCTzoS-0-ac78b6822e6d22e237dee90e8eb9c6a4)
图2.40 错误提示