您的位置:首页 > 编程语言 > C语言/C++

C语言面试宝典题目分析(一)

2014-02-10 15:20 155 查看

昨天从网上找到一份Java面试宝典。然后就去找C++的,结果找到的确实C语言的。在我的概念里,一向C和C++不分(对不起,我一直写面向对象,大一时候老师密授C大法已然搞不清楚了。。),所以决定以固定间隔来对该宝典里面的题做分析,由于本人水平太有限了,如有大神指点,幸甚至哉。

1、关键字static的作用是什么?

这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:

1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

评注:维持其值不变?我记得C++里面的说法是把该变量放到静态区,而不是一般函数的栈,这样该变量的初始化和释放都是在静态区执行而不是随着函数栈的构建和反解而创建和销毁。

2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

评注:这个模块应该指的是链接模块,static关键字会使变量成为内链接,也就是说只可以在文件内访问。所谓文件内部,其实就是前面提到的链接模块。

下面一段话来自互联网:

在c编写的工程中一般一个模块对应一个头文件和一个源文件,前者用于宏、常量和数据类型的定义以及变量的声明和函数的声明;后者用于变量和函数的定义。

头文件中的声明的变量一般是定义在其他模块中、非static、将在本模块的源文件中使用的变量;而声明的函数一般是指本模块中定义的函数(当然也可以是 定义在别的模块,但将要在本模块中使用,不过一般都是定义在本模块中的函数,因为其他模块都有对应的头文件,如果需要使用其他模块中定义的函数,只需在源文件中直接#include该头文件即可)。由于编译器要求所有变量和函数都要先声明后使用,故头文件是必不可少的。

编译器在编译期间的编译对象是一个个模块的源文件,首先将该模块#include的头文件展开,然后对该模块单独编译,对于没有在该模块中定义但却被引用 的变量和函数,必须被声明(声明的目的是告诉编译器这些被引用的对象是被定义在工程中其他的模块的,在编译器执行下一步链接操作时,这些变量和函数是可以被重新定位到其他模块的,),否则会出现编译错误,但是,如果在下一步链接操作时无法定位,则会出现链接错误,不会产生编译错误。

如果把static变量定义在头文件中,那么凡是包含了该头文件的代码都是可以访问该static变量的。说到这里,想起之前看到大家在C++当中使用匿名命名空间以防止外部代码的访问,实际上也是这个效果:在头文件中使用匿名namespace,包含该头文件以后即可访问;在Cpp文件中则不可。

3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

评注:试了一下,静态函数在头文件当中声明,根据static的个性,我们也只能将定义也放到头文件当中了,否则导致找不到定义。但这样又会导致外部可以访问。

既然静态的东西一旦声明就会在静态区插一脚,那么大家都不会在头文件用它。那么,关于static的讨论都似乎要基于static声明在cpp文件的前提。

记得在C++编程思想里面提到过,static本质上就是改变了链接方式,不过在C和C++里面的用法还是很不一样的,因为C++里面还有类。。。

总结:

1、static的使用要放到cpp(如果是C就放到c里面)文件中使用。

2、static修饰的变量也好,函数也好,都是给内部特供的。外人休想插手。

下面的内容来自:http://blog.csdn.net/kaiming2008/article/details/3774045

其实在Java当中,static的作用就非常的单纯,就像下面提到的C++针对类当中static的功能做的补充。

C语言与C++中static,const关键字的区别

1.在C语言中加了static的变量或方法,表明这个变量或方法只能在本文件代码块中访问,外部的文件无法访问它(因为链接程序把它当作内部链接)static变量存放在字段存取区内(同理方法内部的static变量也是存放在这,而不是存放在stack中,所以方法执行时,它只初始化一次).例如:

static int value=20;

static int fun();

这种定义说明它们的访问权限只在本文件块内

2.在C++中static有多种不同的解析,在文件块部,它的代表的意思是跟C语言一样,而它在类中代表着不同的含义,类中的static变量或者static
代表它是属于这个类的,而不是属于类对象的(这点跟Java一样),所以它在内存中只存在一份内存.

3.c,c++const 在声明数据时都有代表是常量的意思,

a. C语言中声明的const数据它默认的链接是外部链接的(当然extern也是外部链接),而且不能用作声明数组的长度(必须使用宏).

b. C++文件内声明的变量它默认的链接却是内部链接,并且它可以用来声明数组的长度,当然它在方法里还代表着不同的意义.如:void
fun(const char* ptr)代表ptr指向的内容不能改变;而在类中定义的方法如:void Class::meth()const;却代表着执行这个方法时不能改变类中的数据,同理,const int
Class::meth()const代表的是执行这个方法时,除了不能改变类中的数据,函数的返回值还是个int常量.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 面试