推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

C语言编程:最常见 7 道C语言面试题,还是有不少人弄不明白?

   2023-08-16 网络整理佚名1290
核心提示:基本上,C语言是其基本语法和库函数的集合,因此程序员定义自己的函数并且将其包含在C语言库中也是很方便的。道面试题将会非常有趣。C语言给与程序员最大的自由,因此只要某种代码C语言的语法没有禁止,程序员就可使用。下面这段C语言代码是一个例子,请看:问题6,C语言中的头文件有什么用?个C语言问题其实属于C语言的基本语法和特点,如果能够熟练掌握,相信对找到一份相关的工作是有帮助的。

C 语言是一种用于一般编程需求的结构化高级编程语言(也被视为中间语言)。 基本上,C语言是其基本语法和库函数的集合,因此也方便程序员定义自己的函数并将其包含在C语言库中。

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

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

如果读者对C语言感兴趣,并且想找到一份C语言程序员的工作,那么下面的7个面试问题将会非常有趣。

问题1、C语言的显着特点是什么?

便携的。 C语言是一种平台无关的编程语言,不使用平台相关库的C语言程序可以很容易地移植到各种平台上。 模块化的。 我们可以很容易地将一个非常大的C语言项目拆成几个小模块,一一实现,最后组合起来解决这个大项目。 灵活的。 C语言给了程序员最大的自由,所以只要某段代码不被C语言的语法所禁止,程序员就可以使用它。 这就是所谓的“法律不禁止的事就做”。

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

C语言中的指针可以指向一块内存。 如果这块内存后来被操作系统回收(释放),但指针仍然指向这块内存,那么此时该指针就是“悬空指针”。 以下C语言代码为示例,请参阅:

无效*p =(大小);

(p);

免费(p); // 现在 p 是一个“悬空指针”

C语言中的“悬空指针”会导致不可预知的错误,而一旦出现此类错误,很难定位。 这是因为在free(p)之后,p指针仍然指向之前分配的内存。 如果这块内存可以被程序临时访问而不会引起冲突,那么后面使用p就不会导致错误。

最难调试的错误是那些不容易重现的错误,对吗?

因此,在实际的C语言程序开发中,为了避免“悬空指针”造成不可预测的错误,在释放内存后,往往会为指针p赋值为NULL:

无效*p =(大小);

(p);

免费(p);

// 避免“悬空指针”

p = 空;

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

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

“悬空指针”是指向已释放内存的指针,“野指针”是具体指向不确定的指针。 “野指针”最常来自于未初始化的指针,例如下面的C语言代码:

void *p;//此时p是一个“野指针”

由于“野指针”可能指向任意内存段,可能会损坏正常数据,并可能引起其他未知错误,所以C语言中的“野指针”比“悬空指针”危害更大。 在实际的C语言程序开发中,定义指针时,一般需要避免“野指针”的出现(赋初值):

无效 *p = NULL;

无效*数据=(大小);

问题4、C语言中函数有什么用?

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

无效 foo() { ... }

此类函数(静态函数)一般出现在稍大一些的C语言项目中。 C 语言中静态函数的主要特征是它们的作用域——仅限于提到的文件。 例如,fun.c 文件中定义的函数不能在其他文件(例如 main.c)中使用。

读者可以尝试使用关键字导入其他文件中定义的函数。

C语言中函数的这一特点使得它常常定义在.h文件中,并且一般与关键字一起使用,以获得类似于函数式宏定义的高效率。

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

所谓“循环”数据类型,其实就是某种类型的数据溢出,从头开始存储。 一个典型的例子是,如果char变量已经等于255,如果还加1,那么该变量就会溢出并从头开始,即等于0:

字符a=255;

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

char类型的变量a是一个无符号8位整数,它能表示的最大值是8位全部为1,即0xff=255。 如果此时加1,则得到0x100。 a只索引8位,即0x100中0x00=0。

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

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

一般C语言程序工程中头文件的后缀是.h,h是.h的缩写。 头文件的使用一般与#结合使用,例如在main.c文件中写入:

# “。H”

意思是把.h的内容扩展到这里。 因此,C语言中的头文件一般包含程序需要使用的函数定义和原型,也可以包含相关的数据结构类型定义。

我们来谈谈“这里展开.h中的内容”的含义——如果.h头文件中的内容是:

//.h头文件

(“你好世界\n”);

然后在其他文件中写入

# “.h”相当于

//.h头文件

(“你好世界\n”);

问题7、C语言中可以添加指针吗?

C语言中的指针包含详细的地址信息,一般不能直接相加,例如下面的C语言代码:

无效*p1 = (无效*)1;

无效*p2 = (无效*)2;

// 下面是非法的

无效 *p = p1+p2;

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

无效*p1 = (无效*)1;

无效*p2 = (无效*)2;

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

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

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

字符 *p1 = (字符 *)1;

字符 *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;

("p1=%p, p=%p\n", p1, p);

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

p1=0x1,p=0x5

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

读者可以尝试将int替换为其他类型。

概括

本节列出的7道C语言题实际上属于C语言的基本语法和特性。 如果你能熟练掌握它们,相信对找到相关工作会有帮助。

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

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON