又一些比试题

来源:互联网 发布:地缘政治 知乎 编辑:程序博客网 时间:2024/04/28 12:48

1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?

答:是的。

2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)

int main()
{
  int i_Count = 0;
  char *pch;
  cin>>pch;
  char *p_Char = pch;
  while(*p_Char != '/0')
     {
         p_Char++;
         i_Count++;
     }
  while(i_Count--)
  {
     cout<<*p_Char;
  }
  return 0;
}

3.请简单描述Windows内存管理的方法。

 不会

4.
#include "stdafx.h"
#define SQR(X) X*X

int main(int argc, char* argv[])
{
 int a = 10;
 int k = 2;
 int m = 1;

 a /= SQR(k+m)/SQR(k+m);
 printf("%d/n",a);

 return 0;
}

  不会

5.
const 符号常量;
(1)const char *p
(2)char const *p
(3)char * const p
说明上面三种描述的区别;

答:(1) 是所指的内容不能改变
  (2) 是指针不能改变
   (3) 是两者都不能改变

6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?
 int n;
 if (n == 10) // 第一种判断方式
 if (10 == n) // 第二种判断方式

答:第二种好.可以防止像if(10 = n)这样的错误出现

7.下面的代码有什么问题?
void DoSomeThing(...)
{
 char* p;
 ...
 p = malloc(1024);  // 分配1K的空间
 if (NULL == p)
  return;
 ...
 p = realloc(p, 2048); // 空间不够,重新分配到2K
 if (NULL == p)
  return;
 ...
}
p = malloc(1024)应该写成 p = (char *)malloc(1024)
没有释放动态申请的空间,会造成内存泄漏.

8.下面的代码有什么问题?并请给出正确的写法。
void DoSomeThing(char* p)
{
 char str[16];
 int n;
 assert(NULL != p);
 sscanf(p, "%s%d", str, n);
 if (0 == strcmp(str, "something"))
 {
  ...
 }
}

1. 下面这段代码的输出是多少(在32位机上).

    char *p;   // 4

    char *q[20];   // 80

    char *m[20][20];  // 1600

    int (*n)[10];   // 4

    struct MyStruct

{

char dda;

double dda1;

int type ;

};
MyStruct k;   // 24

 printf("%d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));

2.

(1)

char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };
for(int i=0;i<12;i++)
printf("%d ",___*(**a+i)____);


在空格处填上合适的语句,顺序打印出a中的数字

(2)

char **p, a[16][8]; 

问:p=a是否会导致程序在以后出现问题?为什么?

编译就通不过,p是一个指针的指针,而a是一个2维数组的首地址。
但是*p = a也是错误的。

3.用递归方式,非递归方式写函数将一个字符串反转.

   函数原型如下:char *reverse(char *str);

#include <stdio.h>

/*=======================================================
函 数 名: reverse()
参    数: str
功能描述: 将一个字符串翻转
返 回 值: const char*
抛出异常: 无
作    者: 刘基伟 2007/4/21
=======================================================*/

const char *reverse(char *str);

int main()
 {
  const char *pch;       // 用于取得函数的返回值,来输出翻转后的结果
     char chArray[] = " Hello World ! ";   // 存储一个将要翻转的字符串
  pch = reverse(chArray);     // 将字符串chArray翻转
  printf("%s/n",pch);         // 打印字符串chArray
  return 0;
 }

const char *reverse(char *str)
 {
  if(str == NULL)
   return NULL;
  int  nCount = 0;           // 用来统计字符串的大小
  int  nCount_div;           // 将字符串的大小折半
  const char *pRemark_begin;       // 标记字符串的首地址
  char chTemp;               // 用于交换字符串的临时变量
  char *pString_begin;       // 存储交换的头指针
  char *pString_end;         // 存储交换的尾指针

  pString_begin = str;
  pRemark_begin = str;

  while(*str != '/0')        // 寻找字符串的结尾
  {
   str++;
   nCount++;
  }
  pString_end = --str;       // 退回一个才是字符串的末尾
  nCount_div = nCount/2;

  while(nCount_div>0)        // 将字符串翻转
  {
   chTemp = *pString_begin;
   *pString_begin = *pString_end;
   *pString_end = chTemp;
   pString_begin++;
   pString_end--;
   nCount_div--;
  }
  return pRemark_begin;
 }
1 读程序段,回答问题
int main(int argc,char *argv[])
{
int c=9,d=0;
c=c++%5;
d=c;
printf("d=%d/n",d);
return 0;
}
a) 写出程序输出
   输出是5,9%5=4 4+1=5
b) 在一个可移植的系统中这种表达式是否存在风险?why?
    存在风险,因为在不同编译器,它的自加的实现可能不一样的。
如果这里先C++完,在对5求余,那结果将是2

#include "stdio.h"
int a=0;
int b;
static char c;
int main(int argc,char *argv[])
{
char d=4;
static short e;

a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);
return 0;
}
a) 写出程序输出
   a=2, b=100, c=2, d=6, e=5
b) 编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bss section),最好用图形方式描述。
   a,b,c,e存储在静态区,d存储在栈里

2 中断是嵌入式系统中重要的组成部分,这导致了许多编译开发商提供一种扩展:让标准C支持中断,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论以下这段代码。
__interrupt double compute_area(double radius)
{
double area = PI * radius *radius;
printf("nArea = %f", area);
return area;
}
在执行printf函数的,area执行了西沟,返回一个幽灵内存

3 C/C++基础知识问题
a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。
   防止隐式的修改
b) C语言中static关键字的具体作用有哪些 ?
   1.记忆功能
   2.数据共享
   3.本地限定
c) 请问下面三种变量声明有何区别?请给出具体含义
1.int const *p;
2.int* const p;
3.int const* const p;
 
   1是指向常量的指针,不可修改指针所指向的内容,但是可以改变指针的指向
   2是常指针,指向一块固定的内存,不可以更改,但是可以修改所指向的内容
   3这里,既不可以改变指针的指向,也不可以修改指针所指向的内容

 

原创粉丝点击