c语言面试题 c语言面试题有经验

c语言是面向结构的高级编程语言(有人认为是中级语言),用于一般编程需求。基本上,C语言是其基本语法和库函数的集合,所以方便程序员定义自己的函数并包含在C语言库中。

c语言面试题 c语言面试题有经验

C语言的主要用途是用其他编程语言编写编译器、操作系统、文本编辑器、后台服务程序、驱动程序、数据库、脚本语言的解释器等实用程序。

c语言甚至可以自己编写编译器。

如果读者对C语言感兴趣,想找一份C语言程序员的工作,下面这7个面试问题会很有意思。

问题1,C语言的显著特点是什么?

可移植的。C语言是一种平台无关的编程语言,不使用平台相关库的C语言程序可以很容易地移植到各种平台上。模块化。我们可以很容易的把一个非常大的C语言项目拆分成几个小模块,一个一个的实现,最后通过组合来解决大项目。灵活。C语言给了程序员最大的自由,所以只要C语言的语法不禁止一个代码,程序员就可以使用。也就是所谓的“法无禁止即可为。”

问题2,什么是C语言中的“悬空指针”?

C语言中的指针可以指向内存。如果这个内存后来作系统回收(释放),但指针仍然指向这个内存,那么这个指针就是一个“挂空指针”。下面的C语言代码就是一个例子,请看:

void * p = malloc(size);

断言(p);

免费(p);//现在P是“挂空指针”

C语言中的“悬挂空指针”会造成不可预知的错误,而这种错误一旦发生,就很难定位。这是因为在free(p)之后,p指针仍然指向之前分配的内存。如果这个内存可以被程序临时访问并且不会导致冲突,那么以后使用p也不会导致错误。

最难调试的bug永远是不能轻易重现的bug吧?

因此,在实际的C语言程序开发中,为了避免“hanging 空 pointer”导致的不可预知的错误,在释放内存后,指针P往往被赋值为NULL:

void * p = malloc(size);

断言(p);

免费(p);

//避免“悬挂空指针”

p = NULL

这样做的好处是,一旦释放的指针p被再次使用,就会立刻引起“段错误”,程序员会立刻知道C语言代码要修改了。

问题3,C语言中的“野指针”是什么?

“挂空指针”指的是释放的内存,“野指针”指的是具体点不确定的指针。“通配符指针”通常来自未初始化的指针,例如下面的C代码:

void * p;//P就是此时的“野指针”。

因为“野指针”可能指向任何内存段,可能会破坏正常数据,可能会引起其他未知错误,所以C语言中的“野指针”甚至比“挂空指针”的危害更大。在C语言程序的实际开发中,定义指针时,一般要尽量避免出现“野指针”(赋值初始值):

void * p = NULL

void * data = malloc(size);

问题4,C语言中的 static 函数有什么用?

相信读者在很多C语言项目中都见过类似如下的静态函数。为什么要用静态关键字来修改函数?这样做有什么用?

静态void foo(){…}

这种静态函数(static function)通常出现在稍微大一点的C语言项目中,C语言中静态函数的主要特点就是它的作用域——只有文件。例如,在fun.c文件中定义的静态函数不能在main.c等其他文件中使用

读者可以尝试使用extern关键字来引入其他文件中定义的静态函数。

C语言中静态函数的这一特点使得它经常在。h文件,并且通常与inline关键字一起使用以获得类似define函数的宏定义的效率。

问题5,C语言中的“循环”数据类型是指什么?

所谓“循环”数据类型,其实就是某一类数据溢出,然后从头开始存储。一个典型的例子是,如果无符号字符变量已经等于255,还在加1,那么变量将从开始溢出,等于零:

无符号字符a = 255

a = a+1;// a等于0

无符号char变量A是一个无符号的8位整数,它能表示的最大值是8位都是1,即0xff=255。如果此时给它加一,就会得到0x100。a仅索引8位,即0x100中的0x00=0。

C语言中的int、long、short等类型也有类似的“循环”特性,不会造成语法编译错误,所以很难判断这些类型的变量是否溢出。而C语言中的float和double类型没有“循环”的特性,所以实际C语言程序开发中检查整数数据是否溢出的一个常用技巧就是使用float和double类型,我在之前的文章中说过,有兴趣的读者可以看看。

问题6,C语言中的头文件有什么用?

一般来说,C语言程序项目中头文件的后缀名称是。h,h是header的缩写。头文件的使用一般与#include结合使用,例如在main.c文件中写入:

#包括& # 34;header.h & # 34

意味着header.h中的内容在这里展开了。所以C语言的头文件一般包含程序需要使用的函数定义和原型,也可以包含相关的数据结构类型定义。

这里是“在这里展开header.h的内容”的含义——如果header.h的头文件中的内容是:

// header.h头文件

printf(& # 34;你好世界\ n & # 34);

然后,把它写在其他文档中。

#包括& # 34;header.h & # 34相当于

// header.h头文件

printf(& # 34;你好世界\ n & # 34);

问题7,C语言中的指针可以做加法运算吗?

C语言中的指针包含了详细的地址信息,所以一般不允许直接添加,比如下面的C语言代码:

void * P1 =(void *)1;

void * p2 =(void *)2;

//以下是非法的。

void * p = P1+p2;

读者可以自己尝试一下。指针p1和指针p2不能直接相加,否则编译器会报错。但是如果你想把指针p1和p2的地址值相加,你可以把它们转换成整型,例如:

void * P1 =(void *)1;

void * p2 =(void *)2;

长p =(长)p1 +(长)p2;

您应该确保强制转换的整数类型宽度大于指针类型宽度,否则您可能会由于数值截断而得到错误的结果。

C语言中的指针虽然不能直接和指针相加,但是可以和其他整数相加,比如下面的C语言代码:

char * P1 =(char *)1;

char * p = P1+1;

指针p1指向地址1,因此指针P指向地址2。没什么好说的。但是,读者要注意以下“陷阱”:

int * P1 =(int *)1;

int * p = P1+1;

对比上面C语言代码的例子,这里只把char换成int。那么,指针p指向哪个地址呢?编写打印代码:

int * P1 =(int *)1;

int * p = P1+1;

printf(& # 34;p1=%p,p = % p \ n & # 34,p1,p);

编译并执行上面的C语言代码,您会发现输出如下:

p1=0x1,p=0x5

可见“1+1”并不等于2,而是等于5。这其实是因为C语言中的指针有自己的含义,不同指针类型的索引内存大小往往不一样。在我的机器上,int类型占用了4个字节的内存空,所以指针p1+1实际上向后移动了4个字节。

读者可以自己尝试把int改成其他类型。

小结

本节列举的七个C语言问题,其实属于C语言的基本语法和特点。如果你能熟练掌握它们,相信对找相关工作会有帮助。

另外,对于编程来说,如果你想学习C/C++编程,或者想工作提高伴侣,如果你想更好的提高自己的编程能力,这有助于你提高水平!这里我也许能帮到你~

编程学习书籍分享:

编程学习视频共享:

分享(源码,项目实战视频,项目笔记,基础入门教程)

欢迎转行学习编程的伙伴,通过使用更多的素材,学会比自己更快的成长!

如果你对C/C++感兴趣,可以关注边肖,后台私信我:【编程通信】我们一起学习吧!可以获取一些C/C++项目学习视频资料!关键词自动回复已经设置好了,自动获取就好!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论