前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言面试(三)

C语言面试(三)

作者头像
用户6280468
发布2022-03-21 09:28:26
2320
发布2022-03-21 09:28:26
举报
文章被收录于专栏:txp玩Linux

今天继续给大家分享面试过程中面试官可能比较喜欢问的一些C语言基础题目!日积月累,你也是专家。

C语言面试题目

1、描述一下两个语句的区别:

代码语言:javascript
复制
 char *p="hello";
 char  p[]="hello";

答案:

(1)、char *p 代表指针 p 是一个指向字符常量的指针,指向一个常量区域,所以的话,就不能去修改内存里面的内容了,如果比如说采用 p[0]='F',这样的话编译器会报错。

(2)、char p[] 中的 p 是一个被分配在一个可读可写内存中的字符数组的首地址,就可以改变数组上的内容。

2、当一个函数中返回一个局部变量的指针时(如下面的例子),会发生什么问题?

代码语言:javascript
复制
void GetString()
{
    char p[] = "hello world";
    return p;
}

答案:

(1)局部数组所占用的内存空间是由编译器分配在栈中的,当函数返回时,这些被占用的栈空间将被编译器添加的代码进行退栈操作,这时原来存放在栈中的数据就统统变成了无效数据了。因此,返回出去的指针将指向一块无效的栈空间,任何通过这个指针对其所指向的内容的访问都是无效(数据可能已经被后续的栈操作所改变)和危险的(通过这个指针所写入的数据有可能冲掉后续栈操作压人的有效数据)。

3、c语言里面使用volatil关键字来修饰变量,请说明它的用法以及常用用法?

答案:

(1) volatile 的作用是告诉编译器,它修饰的变量随时都可能被改变,因此,编译后的程序每次在使用该变量的值时,都会从该变量的地址中读取数据,而不是从寄存器中获取(换句话来理解就是,一个定义为 volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份)。下面举个例子,比较容易出错:

代码语言:javascript
复制
 int square(volatile int *p)
 {
      return (*p) * (*p)
 }

这里的话,是想计算指针 p 所指向内存的值的平方,但是这里使用了 volatile ,可能的话就达不到你要的结果了,我们可以换种写法更加直接明了:

代码语言:javascript
复制
 int square(volatile int *p)
 {
      int a,b;
      a=*p;
      b=*p;

     return a * b;
 }

正确的写法可以参考这个:

代码语言:javascript
复制
 int square(volatile int *p)
 {
      int a;
      a=*p;

     return a * a;
 }

小结:这个关键字的反面使用,就是不希望改变,可以使用关键字 const 的用法,有关 const 的用法,读者可以看看自己掌握了多少?

(2)、它的常见用法:

  • 并行设备的硬件寄存器(如:状态寄存器)。
  • 一个中断服务子程序中会访问到的非自动变量。
  • 多线程应用中被几个任务共享的变量。

4、那么今天的第四道题目,就不公布答案了,留给读者来思考了?

代码语言:javascript
复制
   a+++++b;

思考:

(1)这条语句是啥意思,或者说有啥问题不?

好了,今天的分享就到这里了,希望对你有帮助!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 txp玩Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档