avatar-decorate
获赞
1392
粉丝
2833
关注
6
看过 TA
6060
广州大学
2021
嵌入式软件开发
IP属地:北京
嵌入式软件工程师
私信
关注
2.1   用变量  a   给出下面的定义   (1)一个整型数: int a。  (2)一个指向整型数的指针(一重指针): int *a。  (3)一个指向指针的的指针,它指向的指针是指向一个整型数的指针(二重指针): int **a。  (4)一个有10个整型数的数组 :int a[10]。  (5)一个有10个指针的数组,这10个指针是指向整型数的(指针数组): int *a[10]。  (6)一个指向有10个整型数数组的指针(数组指针):int (*a)[10]。  (7)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(函数指针):int (*a)(int)。  (8)一个有10个指针的数组,这10个指针均指向函数,该函数有一个整型参数并返回一     个整型数(函数指针数组): int (*a[10])(int)。 2.2 下面的代码输出是什么,为什么?  void  foo(void){    unsigned  int a = 6;    int b = -20;    (a + b > 6)? printf("> 6") : printf(" <= 6");}答案:输出是  ">6"。 解读:当运算表达式中存在有符号数和无符号数时,有符号数隐式转换成了无符号数(即底层的补码不变,但是此数从有符号数变成了无符号数)。注意,正数的补码为其本身,负数的补码为其反码+1。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果  ">6"。 2.3   写出  float x   与"零值"比较的  if   语句。答案: if(x >= -0.000001 && x <= 0.000001)解读:因为计算机在处理浮点数的时候是有误差的,所以不能将浮点型变量用"=="或"!="与数字比较,应该设法转化成">="或"<="此类形式。 2.4 下面代码有什么错误? #include void  main() {    char *s = "AAA";    s[0] = 'B';    printf("%s", s);}(1)"AAA"是字符串常量,s是指针,指向这个字符串常量,所以声明s的时候就有问题,应该是cosnt char* s="AAA"。  (2)然后又因为是常量,所以对是s[0]的赋值操作是不合法的。 2.5 下面代码输出是什么? #include void  main() {    int *a = (int *)2;    printf("%d", a + 3);}答案:输出是14。 解读:代码将数值2强制类型转换为int类型指针,int类型指针加3 相当于指向后面第三个int类型变量的首地址,一个int类型变量占4个字节,所以加3相当于指针往后移了12个字节,指向地址14处。以上内容摘自牛客官方专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:    https://blog.nowcoder.net/zhuanlan/v0ELPM嵌入式公司推荐:华为、小米、  OPPO、VIVO、荣耀、一加、   CVTE、   大疆 、insta360影石、  美的 、   TCL 、 海信、创维、烽火、比亚迪、吉利、长安、大众、  经纬恒润 、小鹏、  图森未来、  百度 、   滴滴、蔚来、理想、 联发科、  紫光展锐 、全志、   寒武纪 、  晶晨半导体 、汇顶、   华为、  中兴、   浪潮 、  TP-LINK、讯飞、商汤、   海康威视 、浙江 大华   、360、小马智行、  元戎启行   、  深信服   、移动、联通、电信、旷视、四维图新、中芯国际、复旦微电子。  #嵌入式找工作#
0 点赞 评论 收藏
分享
4.综合题(18道) 4.1 下面代码输出是几?int main()  {      int j = 2;      int i = 1;      if(i = 1) j = 3;      if(i = 2) j = 5;      printf("%d", j);  }  答案:输出为5。 解读:注意if的条件语句用的是赋值符"="而不是等号"==",因此条件一直为真。 4.2 负数和正数的反码、补码分别是什么?(1)负数的反码:对原码除符号位外的其余各位逐位取反就是反码。 (2)负数的补码:负数的补码就是对反码加1。 (3)正数的原码、反码、补码都一样。 4.3 编译和链接有什么不同?(如对外部符号的处理)(1)编译(+汇编)生成的是目标文件(*.o)。编译过程中对于外部符号(如用extern跨文件引用的全局变量)不做任何解释和处理,外部符号对应的就是"符号"。 (2)链接生成的是可执行程序。链接将会解释和处理外部符号,外部符号对应的是地址。 4.4 函数参数的传递方式有几种?(1)两种:值传递、指针传递。 (2)严格来看,只有一种传递,值传递,指针传递也是按值传递的,复制的是地址。 4.5 局部变量能否和全局变量重名?  答案:能,局部会屏蔽全局。要用全局变量,需要使用"::"。 注意:对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 4.6如何引用一个已经定义过的全局变量? 答案:可以用引用头文件的方式(不建议,可能会造成重复定义),也可以用extern关键字。 注意:(1)如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错。 (2)如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在链接期间报错。 以上内容摘自牛客官方专刊《嵌入式岗位笔试面试真题讲解》,数千位同学已订阅,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:  https://blog.nowcoder.net/zhuanlan/v0ELPM推荐公司:华为、小米 、OPPO、VIVO、荣耀、努比亚、CVTE 、 大疆、insta360影石、美的、 TCL、创维、海信、海尔、长虹、烽火、经纬恒润 、小鹏、图森未来、 百度、滴滴、蔚来、理想、比亚迪、吉利、小马智行、元戎启行、摩拜、豪威、 联发科、 紫光展锐、全志、 寒武纪、晶晨半导体、汇顶、 华为、中兴、浪潮、TP-LINK、讯飞、商汤、海康威视、浙江 大华、旷视、360。 #嵌入式找工作#
0 点赞 评论 收藏
分享
3.内存管理&编程题(20道) 3.1由gcc编译的C语言程序占用的内存分为哪几个部分?栈区(stack)存放函数的参数、局部变量。堆区(heap)提供程序员动态申请的内存空间。全局(静态)区(static)存放全局变量和静态变量,初始化不为0的全局变量和静态变量、const型常量在一块区域(.data段),未初始化的、初始化为0的全局变量和静态变量在相邻的另一块区域(.bss段)。程序代码区存放函数体的二进制代码和字符串常量。3.2小端:一个数据的低位字节数据存储在低地址   大端:一个数据的高位字节数据存储在低地址   例如:int a=0x12345678;  //a首地址为0x200,大端存储格式如下:如何判读一个系统的大小端存储模式?(1)方法一:int *强制类型转换为char *,用"[]"解引用 void checkCpuMode(void)  {      int c = 0x12345678;      char *p = (char *)&c;      if(p[0] == 0x12)          printf("Big endian.");      else if(p[0] == 0x78)          printf("Little endian.");      else          printf("Uncertain.");  }  (2)方法二:int *强制类型转换为char *,用"*"解引用 void checkCpuMode(void)  {      int c = 0x12345678;      char *p = (char *)&c;      if(*p == 0x12)          printf("Big endian.");      else if(*p == 0x78)          printf("Little endian.");      else          printf("Uncertain.");  }  (3)方法三:包含short跟char的共用体 void checkCpuMode(void)  {      union Data      {          short a;          char b[sizeof(short)];      }data;      data.a = 0x1234;        if(data.b[0] == 0x12)          printf("Big endian.");      else if(data.b[0] == 0x34)          printf("Little endian.");      else          printf("uncertain.");  }  3.3全局变量和局部变量的区别?(1)全局变量储存在静态区,进入main函数之前就被创建,生命周期为整个源程序。 (2)局部变量在栈中分配,在函数被调用时才被创建,在函数退出时销毁,生命周期为函数内。 3.4以下程序中,主函数能否成功申请到内存空间?#include  #include  #include  void getmemory(char *p)  {      p = (char *)malloc(100);      strcpy(p, "hello world");  }  int main()  {      char *str = NULL;      getmemory(str);      printf("%s", str);      free(str);      return 0;  }  答案:不能。 解读:getmemory(str)没能改变str的值,因为传递给子函数的只是str的复制值NULL,main函数中的str一直都是 NULL。正确的getmemory()如下: ①传递的是二重指针,即str的指针void getmemory(char **p)   {      *p = (char *)malloc(100);      strcpy(*p, "hello world");  }  ②传递的是指针别名,即str的别名,C++中void getmemory(char * &p)   {      p = (char *)malloc(100);      strcpy(p, "hello world");  }  以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:                  https://blog.nowcoder.net/zhuanlan/v0ELPM嵌入式公司推荐:   华为       、    小米         、     OPPO       、VIVO、     CVTE         、     大疆       、insta360影石、美的  、   TCL  、小米    、经纬恒润     、小鹏、 图森未来    、   百度    、滴滴、蔚来、理想、     联发科、 紫光展锐    、全志、   寒武纪    、晶晨半导体   、汇顶、华为     、 中兴    、浪潮    、TP-LINK、    讯飞、商汤、海康威视    、浙江   大华    、360。qi
查看4道真题和解析
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客企业服务