软考程序类答疑回顾(二)

2005-1-14 17:30:00   Count:

一、请详细讲解有关C语言中变量的存储方式。
    答:关于变量的作用域是从变量占用空间的角度来分析问题,由此划分出了全局变量和局部变量。变量的生存期是由变量值存在的时间来分析问题,由此划分出了变量的静态存储和动态存储类型。
    全局变量的存储方式:
    全局变量在编译时分配在静态存储区,全局变量在其定义的文件范围内的使用方法前面已经叙述过,下面再介绍不同文件之间使用全局变量的情况。
(1). 在一个文件内定义了一个全局变量,如果在另一个文件中也引用该全局变量,则必须在引用的文件中用关键字 extern加以说明。
(2). 只允许在所定义的文件中使用的全局变量,必须用static对其加以说明。
局部变量的存储方式:
自动变量:动态存储空间内存储的局部变量称为自动变量,用关键字“auto”作存储类型说明。“auto”也可以省略,未加“auto” 说明的变量,又无其它存储形式说明的,均属动态存储。
局部静态变量:凡存入静态存储区的局部变量称为局部静态变量,用关键字static 加以说明。对“局部静态变量”只可以赋一次初值,如果没有赋初值,则编译系统自动赋初值0。因此,只有在定义局部静态变量时才可以对数组初始化。
寄存器变量:将局部变量的值存放在运算器中的寄存器中,这种变量被称为寄存器变量,用关键字register说明。这样,可以提高程序的执行效率。寄存器数目有限,不能任意定义,有的小型机准许使用3个寄存器来容纳寄存器变量。局部静态变量不能定义为寄存器变量。

二、请问形参和实参有什么区别? 
    答:高级语言在设计程序模块时,模块名定义后,紧跟其后所定义的参数(括弧内)被称为形参(也称虚参)。当该模块被调用时,在主调模块中,出现在被调用的模块名后的参数被称为实参。实参代替虚参的过程被称为虚、实结合,也称换参。多数高级语言的换参是由编译系统来完成,比如C语言和FORTRAN语言亦是如此。BASIC语言的换参则是由程序设计人员来完成的。如果只允许实参向虚参传递,则被称为“单向传递”,C语言的变量类虚、实结合即是“单向传递”。如果同时允许虚参向实参传递,这种传递被称为“双向传递”,FORTRAN 语言定义的子程序即是如此。
当C语言的形参为数组时,形参不另辟存储单元,形参与实参共用内存存储单元。这样,可以节省内存。
C语言在定义函数的同时,对于有参函数,也同时定义了形参。在调用该函数的同时,也指明了实参。实参与形参在内存分别占有两套不同的存储单元(数组除外),但是形参只有在函数被调用过程中才分配存储单元,调用结束后形参占用的单元被释放。数组元素作为实参时,也做为变量来处理。

三、指针运算符&和*的联系与区别是什么?
    答:指针变量虽是正的整数值,但不是整数类型变量。指针变量最基本的运算符是&和*。
(1)&——取地址
 它的作用是返回后随变量(操作数)的内存地址。请注意,它只能用于一个具体的变量或数组元素,不可用于表达式。
例:
             int *p;
             int m;
             m=200;
             p=&m;
    这是将整数类型变量m的地址赋给整数类型的指针变量p。
(2) *——取值
它的作用是返回其后随地址(指针变量所表达的地址值)中的变量值。
例:
             int *p;
             int m;
             int n;
             m=200;
             p=&m;
             n=*p;
这是将指针变量p所指向的整数类型变量(即m)的值赋给整数类型变量n。其结果与赋值语句m=n;一样,但操作过程用了指针变量p。
 &与*运算符互为逆运算。对指针变量px指向的目标变量*px实行取址运算:
             &(*px)
其结果就是px。对变量x的地址实行取值运算:
             *(&x)
其结果就是x。
注意,x与*px同级别可写成x=*px或*px=x。px与&x同级别可写成px=&x,但决不可写成&x=px,也不能写成px=x。

四、请举例说明指针和数组。
    答:用指针和用数组名访问内存的方式几乎完全一样,却又有微妙而重要的差别。指针是地址变量,数组名则是固定的某个地址,是常量。
    若定义一个数组:
           int a[10];
 则在内存中占有从一个基地址开始的一块足够大的连续的空间,以包容a[0],a[1]…,a[9]。基地址(或称为首地址)是a[0]存放的地址。其他依下标顺序排列。
    若定义一个指针:
           int  *p;
    则意味着:p=&a[0];即
              p指向a[0]
              p+1指向a[1]
              p+2指向a[2]
            …
              p+i=&a[i];
              p+i指向a[i]  (i=0,…,9)
(1)在C语言中,数组名本身是指向零号元素的地址常量。因此,p=&a[0]可写成p=a,a当作常量指针,它指向a[0]。p=a+i与p=&a[i]等价,故数组名可当指针用,它指向0号元素。
(2)若定义p为指针,a为数组名,且p=a,则p+i指向a[i],a+i也指向a[i]。
这样,a[i]与*(p+i)或*(a+i)可看成是等价的,可互相替代使用。
注意:由于a只是数组名,是地址常量,而不是指针变量,所以可以写p=a,但不能写a=p,可以用p++,但不能用a++。

五、如何理解C语言中的宏替换?
    答:我们写程序时常常要使用一些在程序执行之前已知的值,当然在程序中可以直接用这些值,但是这样做有二个明显的缺点,使程序不易阅读和修改.在C语言中解决的方法是用宏替换来定义一个
常量其格式为:
#define 标识符号 常数

    通常写在程序的开始处如#define pi 3.14159 那么,使人们一看就知道π的值取3.14159.在以后的程序中不必写出具体数值3.14159,只要写出pi即可.当在一个程序中多次出现pi值,若只想把π值确定得更精确一些为3.1415929535,在不用宏替换的情况下,必须逐行检查,将原来的3.14159改为3.1415929535.采用宏替换后,只要把在程序一开始的定义修改一下即可.而下面程序中均为标识符.这样突出了修改方便的优点,此常数不管在程序中出现多少次,修改时,只需在开始处修改一处即可。
数值常量分十进制,八进制,十六进制三种形式.其中八进制,十六进制是为了适应硬件操作而设置的,在一个数前面加一个0或0x则分别表示其后的数为八进制或十六进制数。
需要说明的是字符常数与字符串常数在存储方式上截然不同,字符常量是用单引号括起来的单一字符,它在机器中占一个字节,而字符串常量则用双引号括起来,它在机器中占n+1个字节,n为字符串字符个数,+1表示有一个串结束标志'\0'。


浏览该文章的用户为您推荐了该信息: 
       
   
   
 
站内检索:
栏目导航
本月授课安排
阅读排行