程序在运行过程中,所处理的数据及运行过程中的临时数据和最终结果都需要保存在计算机内存中,内存单元中存储的数据通过读取而参与运算,通过写入而发生改变。存储数据的内存单元是程序中数据对象的另一种重要的表现形式——变量。为了在程序中有效组织和处理数据,你需要理解变量这种数据形式,掌握在程序中使用变量的要求和操作方法。
1.请运行下面的程序,记录程序结果,并完成表中提出的问题。
(1)程序中涉及哪几个数据对象?其中哪些数据对象发生了变化?
_____________________________
(2)请为变量下定义。
变量是_____________________________。
(3)你认为变量包含哪几个方面的要素?
_____________________________
(4)程序中的变量好似存储数据的容器,你赞同这个比方吗?
○赞同 ○不赞同
(5)根据你对计算机基础知识的了解,你认为变量和计算机的内存储器有联系吗?请谈一谈你的看法。
__________________________________________________________
2.运行下面程序并对照程序输出结果,发现变量与内存的关系和访问变量数据值的方法。
程序运行结果:
(1)C语言中,变量是计算机内存系统中一段命名的内存单元,这段内存单元的起始内存单元的物理地址也就是变量的地址。请描述在程序中获取变量物理地址的方法。
(2)内存单元的物理地址是为访问该内存单元而分配的一个编号,本质上是一个无符号整数。由于其目的是访问对应的内存单元,所以存储、传输、操作变量的物理地址有别于无符号整数,需要使用专门的被称为指针类型的变量来实现。在程序中圈出指针变量,并归纳声明指针变量的方法。
(3)根据程序运行结果和如下示意图,你会发现变量p1和n1之间有(有、没有)关系吗?是哪一条语句使它们建立了联系,在程序中标志出来。
变量n1和p1的数据类型分别是____、____。变量n1对应的内存单元存储的是____,变量p1对应的内存单元存储的是________,我们说变量p1引用(或指向)了变量n1。在C语言中,称p1为指针变量,它的数据类型就是指针类型。指针类型是由其他数据类型(引用类型)派生出来的,如p1的数据类型int16 *,指针变量用于存储其引用类型变量的地址。
_______操作将取得变量的物理地址。取变量p1的物理地址操作是____,取得的地址值是_____。
(4)指针变量p1、p2、p3的引用类型分别是___、___、___,由程序运行结果可知它们的类型大小相同(相同,不同)吗?它们的引用类型相同(相同,不同)吗?实际上任何类型变量的内存地址的类型(无符号整型)都是相同的,但为什么要为指针变量声明不同的引用类型呢?想一想。
(5)能通过指针变量p1去访问它引用的变量n1吗?是如何实现的?试一试在程序中找出来并写在下面。
日积月累
●变量是在程序运行过程中其值可以发生变化的数据对象,它其实是一段命名的内存单元。内存单元的电路状态表示变量的数据,变量的数据类型决定了对内存电路状态的解释。
●编译器根据变量的数据类型为变量分配内存单元,数据类型决定了分配给变量内存单元数。
●变量包括变量名、数据类型和变量值3个基本要素。
●变量名是一个合法的用户自定义标识符。变量名是对应内存单元的符号化地址。通过“&变量名”的形式可获得该变量所对应内存单元在内存系统中的物理地址。
●指针变量用于存储变量的内存地址,它的数据类型称为指针类型,是由变量的类型(称为引用类型,如int、long、double、char等)派生的,方法是:
类型名 *
例如:double *p;,声明了指针变量p,其类型是double *,p可以引用或指向任何double类型的变量。
有double x,y;,则语句p=&x;使p指向变量x,p也可以指向其他double型变量,比如y。
●通过指针变量访问其指向的变量,称为解引用。解引用方法是在指针变量前缀解引用运算符(*),即“*指针变量名”。如有double x,y; p=&x;,则*p等价于x。
●在程序中变量直接代表了所对应内存单元中存储的数据值。
内存与数据存储(延伸阅读)
眼下留神
●内存储器是一片集成电路,其电路状态代表数据。一段内存单元的电路状态所表示的最终数据形式由数据类型解释而定。变量的数据类型不但决定了为变量分配的内存单元数,同时还决定了对这段内存单元电路状态的解释。
●指针变量存储的数据总是被编译器视为内存地址,虽然内存地址是一个无符号整数,但编程中要避免直接给指针变量赋值一个无符号整数,这个无符号整数作地址可能不是编译器合法分配的,将引发运行时错误。
●不同引用类型的指针变量,它们存储的都是相同类型的内存地址,但却不能让指针变量指向与它引用类型不同的变量。如果这样做,将引发数据读取混乱。
●在一个引用类型下声明多个指针变量时,要在每个指针变量前置*,否则,除前置有*的变量是指针变量,其他直接是引用类型的变量。使用typedef定义指针类型后,可以避免这种情况。
●由于使用习惯的原因,指针类型、指针类型的变量、指针变量的值被简单地统称为指针,你需要根据当时语境来明确其具体所指。
3.阅读并运行下面两个程序,程序2在运行时输入K,根据程序的运行结果,描述在程序中变量的使用要求,然后完成表中提出的问题。
(1)在程序中使用变量必须要_______。
(2)定义变量要指出___和____,其一般格式为:
_____________________________
(3)程序2出现了什么问题?是什么原因?
_____________________________
(4)变量定义后的值:
○确定 ○不确定
(5)为变量预置初始值有两种方法,在上面左侧的程序中找出,并进行归纳。
①___________ ②___________
眼下留神
●符号“=”的作用是给变量赋值,它被称为赋值号。赋值号把它右边的值赋给它左边的变量,就是向变量对应的内存单元中写入数据。
●未赋值的变量其值不确定,不确定的值不能参加运算。因此,变量在参与运算前一定要设置它的初始值。
●变量可在需要时随时定义。建议在一段代码块前集中定义,以方便管理。
●在类型标识符前加关键字const将标识符对应的内存空间处于只读状态,此标识符代表的数据不可更改,这就是常量。定义常量的一般格式为:
const 类型标识符 常量名=字面量值;
如语句const float PI=3.14;定义了一个float型常量PI。不能为常量重新赋值,PI=3.1415;是错误的语句。
日积月累
●在C语言程序中使用变量必须遵守“先定义后使用,使用前置初值”的原则。
●定义变量的一般格式为:
类型标识符 变量名列表;
类型标识符即数据类型的名称,如int,float,char等。变量名列表是用逗号(,)分隔的变量名组成。
●为变量预置初始值有初始化和赋初值两种形式。变量初始化是在定义变量时预置它的初始数据;赋初值是指定义变量后,在使用之前的赋值操作。
初始化:int x=1,y=2,z=3; 赋初值:int x,y,z;x=1;y=2;z=3;
4.请根据你对变量相关知识的理解,完成下面的任务。
(1)请为下面的对象定义相应的变量。
①珠峰的高度(单位:m):_____________________________
②你所在班的学生人数:_____________________________
③中国人口总数:_____________________________
④英语书法等级,初始等级为C级:_____________________________
⑤一次考试的语文、数学和英语三科成绩:_____________________________
(2)请说明你这样定义变量的理由。
_______________________________________________________________________________________
(1)C语言的常用数据类型有____、_____、_____。
(2)C语言中的数据对象有____和____两种形式。
(3)定义符号字面量DOMAIN代表字符串"sun.com"的命令是____。
(4)变量包括____、_____和____3个要素。
(5)变量的使用遵守____原则。
(6)在书写实型字面量时对十进制小数形式的写法要求是____,对指数形式的写法要求是____。
(7)字符型字面量有______和_____两种形式,它们使用的定界符分别为_____、_____。
(8)在存储数据5和5LL时,分别占用的内存大小是____和____。
(9)指针变量用于存储_,定义一个指向char变量的指针pc的语句是___。
(10)有double *pd,dv;,则sizeof(pd)=___,sizeof(dv)=___。
(11)有int *p,cn=51;p=&cn;*p=36;则cn的值为____。
(12)有typedef long double ldouble;则sizeof(ldouble)=____。
(1)字面量表示在程序中值不发生改变的数据对象,变量是在程序中其值可能发生改变的量。( )
(2)变量名是变量所对应内存单元的符号化地址。( )
(3)变量所对应内存单元的个数决定于所存储数据的大小。( )
(4)变量定义且赋予初始值后,才能参加运算。( )
(5)转义字符只能视为一个字符。( )
(6)“1”是一个字符,“111”是一个字符串。( )
(7)符号字面量其值可以发生改变。( )
(8)反斜线(\)和字母的组合都是转义字符。( )
(9)语句long *p1,p2;声明了p1和p2两个指针变量。( )
(10)指针变量和其他变量都是存储在计算机内存中的。( )
(11)typedef int * pn;创建了一个指针类型pn。( )
(12)字面量是一个只读型变量。( )
(1)下列数据在存储时所占内存空间最多的是( )。
A.32L
B.320
C.3200
D.3.2
(2)下列选项中,均是合法整型字面量的是( )。
(3)下列选项中,均是合法实型字面量的是( )。
(4)下列转义字符,正确的是( )。
A.'\K'
B.'\x99'
C.'\99'
D.'/n'
(5)下列正确的字符字面量是( )。
A.'字'
B.'\100'
C.'\x'
D.'\'
(6)下列定义符号字面量PK,正确的是( )。
A.#define PK "NO"
B.#define PK "NO";
C.#define "NO" PK
D.#define PK= "NO"
(7)下列关于变量的定义及设置初始值,正确的是( )。
A. float x=0; y=0; z=0;
B. int a=1,b=2,c=3;
C.float x=y=z=0;
D.int a,b,c=1,2,3;