Q1.数据类型有哪些?每种类型的字节大小是多少?
AN1:数据类型可分为四大类第一类基本类型第二类构造类型第三类指针类型(*)第 四类空类型(viod)
基本类型又分四类1.整型(短整型short int,基本整型int,长整型long int)2.字符
型(char)3.浮点型(单精度float,双精度double,长双精度long double)
4.枚举类型(enum)
构造类型分1.数组类型2.结构体类型(struct)3.共用体类型(union)
AN2:类型说明符 数的范围 字节数
int -2^31~(2^31-1) 4
unsigned int 0~65535 4
short int -32768~32768 2
unsigned short int 0~65535 2
long int -2^31~(2^31-1) 4
unsigned long 0~(2^32-1) 4
char -128~127 1
unsigned char 0~255 1
Q2.什么是定义?什么是声明?二者有什么区别?
定义:(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们常说的变量名或对象名。
声明:有两重含义1.告诉编译器,这个名字已经匹配到一块内存上。声明可以多次出现2.已经将内存地址使用,该地址不能被其他对象使用
区别:定义可被其他对象使用,而声明不能
Q3.什么是变量的指针和指针变量?两者有什么区别?
所谓变量的指针即指变量在内存所占的存储单元的起始地址,而指针变量是指专门存放某类对象的地址(指针)的变量。如:int a,*pa; &a就是变量a的指针,即变量a的地址,而pa是一个指针变量,用它可以指向整型数据的变量,即存放一整型变量的地址(指针),如pa=&a,此时pa指向变量a。两者的区别光从概念上区分是容易的,但实际使用时要区分并不容易,需要注意的是,并不一定要定义一个指针变量才可以使用变量的指针,而指针变量也只有指向一具体的变量时,它才真正有意义,它提供一种间接访问变量的一种方式。
Q4.定义时用static修饰的外部变量是何含义?又有什么作用?
在函数外部定义的变量称为外部变量。在定义外部变量的时候加static修饰符的含义是使得该外部变量只能供本程序文件内部各函数使用,对于程序的其他程序文件是不可见的(千万别以为是使该外部变量存储在静态存储区,即为静态变量,记住所有外部变量都是静态变量)。这样做的好处是,为了减少各个程序文件之间的相互干扰,即出现同名的外部变量,尤其是在一个程序由多个程序员开发的情况下,加static的外部变量可以使各程序文件出现同名的外部变量,程序员可以完全按自己的意愿定义变量,而把要大家都可见的变量专门定义在一个文件中,然后在各程序文件加以说明。
Q5.如何正确使用递归调用?
能解决实际问题的递归算法都是由两部分构成,即递归表达式和递归出口,其中任何一个方面缺少问题都无法正确解。能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成一些规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题构造出规模稍大问题的解,最后当N=1(或其它确定值),时能直接得到问题的解(即递归出口)。
Q6.如何看待“空函数”?
所谓“空函数”即函数体为空的函数,也就是函数体只是由一对花括号构成的函数。可能你会想既如此,空函数没有任何可执行的实体,又何必要定义呢?确实,从这个意义上讲空函数没有存在的必要,但“存在的就是合理的”,正因为它的函数体是空的,所以也就不可能在函数体出现任何错误,也因此,空函数可以在程序调试过程中广泛使用,尤其是多模块程序的调试。我们在调试一个函数时,可以先用空函数暂时代替待检函数所调用的函数,在确定该函数无误以后,我们在把空函数用实际函数代替,如有错,则很容易获知错误是来自刚加入的这个函数。
注意的是,不能把空函数与无参函数混为一谈。
Q7.如何看待枚举类型?它有什么作用?
所谓类型指的是凡属于该类型的变量的值都一一列举出来的一种数据类型。象结构体类型和共用体类型一样枚举类型也须先定义数据类型,再定义该类型的变量。正确使用枚举类型要注意以下几个方面:
首先,定义枚举类型时,用圆括号括起来的都是枚举常量,它们不是变量,不可以对其赋值;
其次,枚举常量对应一个整数值,在默认的情况下,第一个枚举常量,就整数0,第二个枚举常量对就1,……如此类推,但也可以按编程人员的意思进行调整;
再次,有输出枚举常量时,不可把它当作一个字符串常量,只能将其视为一个整数值;
最后,枚举常量可以参加整数可以进行大多数运算。
从某种意义上说,枚举类型是整型类型的一种特例,但既然专门定义枚举类型自然有它的好处,首先,因为枚举常量相当于一个符号常量,故具有见名而知义的好处,可以提高程序的可读性;其次,因为属于某一枚举类型的变量其取值只能限于在所列的枚举常量范围内,只要其值超出这个范围,系统即视为出错,这相当于让系统帮助检查错误,从面降低编程难度。
Q8.如何正确使用typedef定义新的类型名?
C语言是一种比较尊重程序人员个性的程序设计语言,除了可以使用C提供的标准类型名和自己声明的结构体、共用体、指针、枚举类型外,还可以用typedef声明新的类型名来定义相应的变量。
用typedef定义的新的类型名的一般方法是:
⑴先按定义变量的方法写出定义体(int k;)
⑵将变量名换成新的类型名(int ROTATE)
⑶在最前面加typedef(typedef int ROTATE)
⑷然后就可以用新定义的类型名定义变量了。(ROTATE rot1,rot2;)
值得注意的是,typedef只是定义新的变量名,而不是定义一个新的数据类型,也就是typedef不是为系统增加了一个数据类型,而只是为已有的数据类型定义了一个别名罢了。一般用在当数据类型名较长时,如结构体类型名、工段用体类型名等,或者是用在希望C语言的数据类型名具有其他程序设计语言的数据类型名的特点时,如熟悉Pascal语言的程序员用C语言编程时,就希望按pascal的习惯使用数据类型说明符。
Q9.结构体类型和共用体类型有什么区别?
结构体类型和共用体类型都是C语言支持的两种组合数据类型,在定义形式及使用方式都表现出很多的相似之处,但它们之间的差别是非常悬殊的。结构体类型是把由不同数据类型(当然也可以是相同数据类型)的域所构成的,各个域一般都是用来表示不同对象的各方面的属性的,它们在存储区中都分别占有各自不同的存储空间,任何时刻对某个域进行修改都不会影响到其它域;而共用体类型虽然也包含若个域,但它的各个域都共享同一个存储区,即各个域的存储地址都是相同,也正因于此,一般不太多关心共用体各成员的地址,而且对共用体某个域的修改都会影响其它域,即只是最近的一次都任一成员的赋值有效,一般用于描述不同对象的类似的属性。
Q10.结构体变量的使用应注意哪些问题?
根据笔者经验,使用结构体变量时应注意以下问题:
第一,应该先定义结构体类型,然后再用该类型定义相应的结构体变量;
第二,不能将一个结构体变量作为一个整体进行输入和输出,但现在C语言版本,允许把一个结构体变量整体赋值给另一个同类型的结构体变量,也允许用结构体变量作为函数参数;
第三,如果结构体变量的成员仍是结构体类型,应该一级一级地找到其最低一级成员,只能对最低级成员直接输入和输出;
第四,可以使用结构体变量的成员的地址,不过通过某结构体变量成员的地址去访问其他成员往往是行不通的,即不能象数组那样,上一元素的指针,加1就指向下一个数组元素,对于结构体类型一般是不具有这种性质的。
第五,应该多注意结构体类型的定义细节,各个域的说明都是括在一对花括号内部,更别忘了花括号后面的分号(很容易忘掉的哟)。