嵌入式研发工程师面试试题大全(ANSI CC++方面的知识 )

来源:互联网 发布:乐视网络电视盒 编辑:程序博客网 时间:2024/06/07 13:12

一.ANSI C/C++方面的知识
  1、简答题。
  
  1、 如何在C中初始化一个字符数组。
  
  逐个字符赋值:char s[] = {‘A’,’B’,’C’,’D’};
  
  字符串赋值:char s[] = {“ABCD”};
  
  对于二维字符数组:char s[2][10] = {“cheng”,”jinzhou”};
  
  
  2、 如何在C中为一个数组分配空间。
  
  如果是栈的形式,Type s[N]定义后系统自动分配空间,分配的空间大小受操作系统限制;
  
  若是堆的形式,Type *s; s = (Type *)malloc(sizeof(Type) * N); 分配的空间大小不受操作系统限制。
  
  
  3、 如何初始化一个指针数组。
  
  这里有必要重新对比一下指针数组与数组指针的差异。
  
  a. 指针数组:数组里存储的是指针。
  
  如:int * s[ 5 ] 表示数组s里存储了5个指向整型的指针。
  
   Char * s[ 3 ] = {“aaaaa”,”bbb”,”ccccc”} 表示数组s里存储3个指向字符型的指针,分别指向字符串aaaaa、bbb、ccccc。
  
  b. 数组指针:其实就是数组,里面存放的是数据。
  
  如:int ( * s )[ 5 ] 表示数组s里存储了5个整型数据。
  
  
  4、 如何定义一个有10个元素的整数型指针数组。
  
  Int * s [ 10 ];
  
  
  5、 s[10]的另外一种表达方式是什么。
  
  * ( s + 10 )
  
  二维数组S [ 5 ][ 8 ]的表示方法:*( *(s + 5) + 8 )
  
  
  7、 要使用CHAR_BIT需要包含哪个头文件。
  
  Include limits.h
  
  在该头文件里 #define CHAR_BIT 8
  
  
  8、 对(-1.2345)取整是多少? -1
  
  
  9、 如何让局部变量具有全局生命期。
  
  使用Static,局部变量就存储在全局区(静态区),便具有全局的生命期和局部的访问控制。
  
  
  10、C中的常量字符串应在何时定义?
  
  没有理解到题目的意思,我只是想说明一点,定义常量字符串后它属于const型,不能去修改它,否则程序出错。
  
  
  11、如何在两个.c文件中引用对方的变量。
  
  尚不清楚,望博友能告知,万分感谢!
  
  
  12、使用malloc之前需要做什么准备工作。
  
  定义一个指针后就可以malloc了。
  
  
  13、realloc函数在使用上要注意什么问题。
  
  Realloc后返回的指针与之前malloc返回的指针指向的地址不同。
  
  
  14、strtok函数在使用上要注意什么问题。
  
  首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL
  
  
  15、gets函数在使用上要注意什么问题。
  
  这里要将Scanf( )、gets( )放在一起比较。Scanf( )是遇到空格就判断为输入结束,而gets( )则遇到回车才判断为输入结束。
  
  
  16、C语言的词法分析在长度规则方面采用的是什么策略?
  
  尚不清楚,望博友能告知,万分感谢!
  
  
  17、a+++++b所表示的是什么意思?有什么问题?
  
  根据自增运算符的右结合性,它是(a++)+(++b)的意思,但有的编译器里省略括号就不能通过,同时也降低了程序可读性。
  
  
  18、如何定义Bool变量的TRUE和FALSE的值。
  
  #define TRUE 1
  
  #define FALSE 0
  
  
  19、C语言的const的含义是什么。在定义常量时,为什么推荐使用const,而不是#define。
  
  Const是只读的意思,它限定一个变量不允许被改变。
  
  #define缺乏类型检测机制,在预处理时候有可能引发错误。
  
  Const方面的其它知识扩展:
  
   问题1:const变量 & const 限定的内容
  
  下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?
  
    typedef char * pStr;
  
    char string[4] = "abc";
  
    const char *p1 = string; // *p1 作为整体不能被修改,但p1可以修改,p1++合法
  
    const pStr p2 = string; //p2作为一个整体,不能被修改,但是下面的p2++非法修改
  
    p1++;
  
    p2++;
  
       
  
  问题2:const变量 & 字符串常量
  
  请问下面的代码有什么问题?
  
  char *p = "i''''m hungry!"; //定义的是字符串常量
    p[0]= ''''I'' //不能修改字符串常量
    
  
  问题:const变量 & 字符串常量2
  
    char a[3] = "abc" 合法吗?使用它有什么隐患?
  
  没有考虑到字符串结束符‘/0’,所以会产生意想不到的错误。
  
    比如以下程序:
  
  int main()
  
  {
  
   int i;
  
   char p[6] = {''''a'''',''''b'''',''''c'''',''''d'''',''''e'''',''''f''''};
  
   printf("%s",p);
  
   while(1);
  
   return 0;
  
  }
  
  运行后显示: abcdef@
  
  问题3:const & 指针
  
  类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?    
  
  1)、const在前面
  
  a. const int nValue; //nValue是const
  
  把类型int撇开,变量nValue作为一个整体,因此 nValue是const型;
  
  b. const char *pContent; //*pContent是const, pContent可变
  
  把类型char撇开,变量 *pContent作为一个整体,因此 *pContent是const型;
  c. const (char *) pContent;//pContent是const,*pContent可变
  
  把类型char * 撇开,注意这里(char * )是一个整体,而变量 pContent作为一个整体,因此 pContent是const型;
  
  d. char* const pContent; //pContent是const,*pContent可变
  
  const与变量间没有类型,变量 pContent作为一个整体,因此 pContent是const型;
  
  e. const char* const pContent; //pContent和*pContent都是const
  
  这里分为两层,外层:把类型char 撇开,变量 * const pContent作为一个整体,因此 * pContent是const型;内层:没有类型,因此 pContent 是 const 型。
  
  2)、const在后面,与上面的声明对等 (这类型更容易判断)
  
  a. int const nValue; // nValue是const
  
   const与变量之间没有类型,const后面那部分整体是const型,因此nValue是const型
  
  b. char const * pContent;// *pContent是const, pContent可变
  
   const与变量之间没有类型,const后面那部分整体是const型,因此 * pContent是const型
  
  c. (char *) const pContent;//pContent是const,*pContent可变
  
   const与变量之间没有类型,const后面那部分整体是const型,因此 pContent是const型
  
  d. char* const pContent;// pContent是const,*pContent可变
  
   const与变量之间没有类型,const后面那部分整体是const型,因此 pContent是const型
  
  e. char const* const pContent;// pContent和*pContent都是const
  
  分为两层,外层:撇开类型char,const后面那部分整体* const pContent是const型,因此 * pContent是const型;内层:const与pContent之间无类型,因此pContent是const型。
  
    
  
  C++中CONST
  
   C中常用:#define 变量名 变量值定义一个值替代,然而却有个致命缺点:缺乏类型检测机制,这样预处理理在C++中成为可能引发错误的隐患,于是引入const.
  
  const使用:
  
  1. 用于指针的两种情况:const是一个左结合的类型修饰符.
  
   int const *A; //A可变,*A不可变
  
   int *const A; //A不可变,*A可变
  
  2.限定函数的传递值参数:
  
  void function(const int Var); //传递过来的参数在函数内不可以改变.
  
  3.限定函数返回值型.
  
  const int function(); //此时const无意义
  
  const myclassname function(); //函数返回自定义类型myclassname.
  
  
  
  
  20、C语言的volatile的含义是什么。使用时会对编译器有什么暗示。
  
   volatile的本意是“易变的”
  
  由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化,但有可能会读脏数据。当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
  
  精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
  
  下面是volatile变量的几个例子:
   1). 并行设备的硬件寄存器(如:状态寄存器)
   2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
   3). 多线程应用中被几个任务共享的变量
   嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
  
  Volatile的完全扩展:
   1). 一个参数既可以是const还可以是volatile吗?解释为什么。
  
  是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
   2). 一个指针可以是volatile 吗?解释为什么。
  
  是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
   3). 下面的函数有什么错误:
   int square(volatile int *ptr)
   {
   return *ptr * *ptr;
   }
   这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
   int square(volatile int *ptr)
   {
   int a,b;
   a = *ptr;
   b = *ptr;
   return a * b;
   }
   由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
   long square(volatile int *ptr)
   {
   int a;
   a = *ptr;
   return a * a;
   }

原创粉丝点击