嵌入式C 面试题

时间:2020-11-30 11:59:22
1. 引用与指针有什么区别?
 
2. 堆栈溢出一般是由什么原因导致的?
     

3.  什么函数不能声明为虚函数?
    

4. 写出float x 与“零值”比较的if语句。
  

5. 不能做switch()的参数类型是:
 

6. 头文件中的 ifndef/define/endif干什么用?
 
 
7. #include 和 #include "filename.h" 有什么区别?
 
 
8. 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
 

9.char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
结果是:
 
10.
main()
{
   int a[5]={1,2,3,4,5};
   int *ptr=(int *)(&a+1);
   printf("%d,%d",*(a+1),*(ptr-1));
}
输出结果是:
 

11. 交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;
 
 
12. 列举几种进程的同步机制,并比较其优缺点。
 
 
13.  进程死锁的原因和4个必要条件
 
 
14. 要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
 

15.
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问
p1+5=______;
p2+5=______;

16、设有以下说明和定义:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句 printf("%d",sizeof(too)+sizeof(max));的执行结果是:______
 
 
 
试题1:
 
Void test1()
{
    char string[10];
    char* str1="0123456789";
    strcpy(string, str1);
}
 
试题2:
 
Void test2()
{
    char string[10], str1[10];
    for(I=0; I<10;I++)
    {
        str1[i] ='a';
    }
    strcpy(string, str1);
}
 
试题3:
 
Void test3(char* str1)
{
    char string[10];
    if(strlen(str1) <= 10)
    {
        strcpy(string, str1);
    }
}
在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为:
 
 
 

试题4:
 
void GetMemory( char *p )
{
    p = (char *) malloc( 100 );
}
void Test( void )
{
    char *str = NULL;
    GetMemory( str );
    strcpy( str, "hello world" );
    printf( str );
}
 
试题5:
 
char *GetMemory( void )
{
    char p[] = "hello world";
    return p;
}
void Test( void )
{
    char *str = NULL;
    str = GetMemory();
    printf( str );
}
 
试题6:
 
void GetMemory( char **p, int num )
{
    *p = (char *) malloc( num );
}
void Test( void )
{
    char *str = NULL;
    GetMemory( &str, 100 );
    strcpy( str, "hello" );
    printf( str );
}
 
 

试题7:
 
void Test( void )
{
    char *str = (char *) malloc( 100 );
    strcpy( str, "hello" );
    free( str );
      //省略的其它语句
}
评价以上程序
 
 
 
试题1:分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)
 
 
 

试题2:以下为Windows NT下的32位C++程序,请计算sizeof的值
void Func ( char str[100] )
{
 sizeof( str ) = ?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
 解答:
 
 

试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?
least = MIN(*p++, b);
解答:
 
 
 
 
试题4:为什么标准头文件都有类似以下的结构?
 
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif
#endif
解答:
 
 
 
试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”
函数头是这样的:
//pStr是指向以'\0'结尾的字符串的指针
//steps是要求移动的n
void LoopMove ( char * pStr, int steps )
{
 //请填充...
}
解答:
 
 

试题6:已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析WAV格式的各项信息。
WAVE文件格式说明表
偏移地址 字节数 数据类型 内 容
文件头
00H 4 Char "RIFF"标志
04H 4 int32 文件长度
08H 4 Char "WAVE"标志
0CH 4 Char "fmt"标志
10H 4   过渡字节(不定)
14H 2 int16 格式类别
16H 2 int16 通道数
18H 2 int16 采样率(每秒样本数),表示每个通道的播放速度
1CH 4 int32 波形音频数据传送速率
20H 2 int16 数据块的调整数(按字节算的)
22H 2   每样本的数据位数
24H 4 Char 数据标记符"data"
28H 4 int32 语音数据的长度
解答:
 
 
 
试题7:编写类String的构造函数、析构函数和赋值函数,已知类String的原型为:
class String
{
 public:
  String(const char *str = NULL); // 普通构造函数
  String(const String &other); // 拷贝构造函数
  ~ String(void); // 析构函数
  String & operate =(const String &other); // 赋值函数
 private:
  char *m_data; // 用于保存字符串
};
 
解答:
 
 

试题8:请说出static和const关键字尽可能多的作用
解答:
 
 

试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
解答:
 
 
 
试题2:写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
解答
 
 
 

试题3.不用第三变量交换两个数
 
 
 
试题4.求大数的阶乘例如100!,使用通常的做法会溢出,这里要使用数组的方法。例如:123*20 相当于 100*20 + 20*20+3*20
 1.设一棵完全二叉树有700个结点,则在该二叉树中有多少个叶子结点
 
 
2.static 数据成员必须在类定义的外部定义。不象普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。
 
 

3.求函数返回值,输入x=9999;
int func ( x )
{
int countx = 0;
while ( x )
{
countx ++;
x = x&(x-1);
}
return countx;
}
输出为:
 
 
4.分析下面的程序
struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
struct s2
{
int i: 8;
int j: 4;
double b;
int a:3;
};
printf("sizeof(s1)= %d\n", sizeof(s1));
printf("sizeof(s2)= %d\n", sizeof(s2));
result: 16, 24
第一个struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b; };
 
5.在对齐为4的情况下 分析下面程序的结果
struct BBB
{
long num;
char *name;
short int data;
char ha;
short ba[5];
}*p;
p=0x1000000;
p+0x200=____;
(Ulong)p+0x200=____;
(char*)p+0x200=____;
 
6.分析一下下面程序的输出结果
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
typedef struct AA
{
         int b1:5;
         int b2:2;
}AA;
void main()
{
        AA aa;
        char cc[100];
        strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
        memcpy(&aa,cc,sizeof(AA));
        cout << aa.b1 <<endl;
        cout << aa.b2 <<endl;
}
 

7.改错:
#i nclude
int main(void) {
     int **p;
     int arr[100];
     p = &arr;
     return 0;
}
 
 

8.写一个内存拷贝函数,不用任何库函数.
 
 
9.将一个数字字符串转换为数字."1234" -->1234
 
 
10.写出运行结果
#include
#include
#define STRCPY(a, b) strcpy(a##_p, #b)
#define STRCPY1(a, b) strcpy(a##_p, b##_p)
int main(void) {
        char var1_p[20];
        char var2_p[30];
        strcpy(var1_p, "aaaa");
        strcpy(var2_p, "bbbb");
        STRCPY1(var1, var2);
        STRCPY(var2, var1);
        printf("var1 = %s\n", var1_p);
        printf("var2 = %s\n", var2_p);
        return 0;
}
 

11:此题考查的是C的变长参数,就像标准函数库里printf()那样.
#include
int ripple ( int , ...);
main()
{
    int num;
    num = ripple ( 3, 5,7);
    printf( " %d" , num);
}
 
 
int ripple (int n, ...)
{
    int i , j;
    int k;
    va_list p;
    k= 0; j = 1;
    va_start( p , n);
    for (; j
    {
        i = va_arg( p , int);
        for (; i; i &=i-1 )
            ++k;
    }
    return k;
}
这段程序的输出是:
(a) 7 (b) 6 (c) 5 (d) 3
 
 
12.要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;
那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
 
 
13.C++中为什么用模板类
 
 
 
部分IT公司的笔试小算法题精选
1、将一整数逆序后放入一数组中(要求递归实现)
 
 
2、求高于平均分的学生学号及成绩(学号和成绩人工输入)
 
3、递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
 
 
4、组合问题(从M个不同字符中任取N个字符的所有组合)
 
 
5、分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
 
 
6、寻找迷宫的一条出路,o:通路; X:障碍。(大家经常谈到的一个小算法题)
 
 
7、随机分配座位,共50个学生,使学号相邻的同学座位不能相邻(早些时候用C#写的,没有用C改写)。
 
 
8、求网格中的黑点分布。现有6*7的网格,在某些格子中有黑点,已知各行与各列中有黑点的点数之和,请在这张网格中画出黑点的位置。(这是一网友提出的题目,说是他笔试时遇到算法题)
 
 
9、有4种面值的邮票很多枚,这4种邮票面值分别1, 4, 12, 21,现从多张中最多任取5张进行组合,求取出这些邮票的最大连续组合值。(据说是华为2003年校园招聘笔试题)
 

10、大整数数相乘的问题。(这是2002年在一考研班上遇到的算法题)
 
 
11、求最大连续递增数字串(如“ads3sl456789DF3456ld345AA”中的“456789”)
 
 
12、四个工人,四个任务,每个人做不同的任务需要的时间不同,求任务分配的最优方案。(2005年5月29日全国计算机软件资格水平考试——软件设计师的算法题)。
 
 
13、八皇后问题,输出了所有情况,不过有些结果只是旋转了90度而已。(回溯算法的典型例题,是数据结构书上算法的具体实现,大家都亲自动手写过这个程序吗?)
 
 
14、实现strstr功能,即在父串中寻找子串首次出现的位置。(笔试中常让面试者实现标准库中的一些函数)
 
 
15、现在小明一家过一座桥,过桥的时候是黑夜,所以必须有灯。现在小明过桥要1分,小明的弟弟要3分,小明的爸爸要6分,小明的妈妈要8分,小明的爷爷要12分。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30分就会熄灭。问小明一家如何过桥时间最短?(原本是个小小智力题,据说是外企的面试题,在这里用程序来求解)
 
 
16、2005年11月金山笔试题。编码完成下面的处理函数。函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)
 
 
17、2005年11月15日华为软件研发笔试题。实现一单链表的逆转。
 
 
18、编码实现字符串转整型的函数(实现函数atoi的功能),据说是神州数码笔试题。如将字符串 ”+123”à123, ”-0123”à-123, “123CS45”à123, “123.45CS”à123, “CS123.45”à0
 
 
19、歌德巴赫猜想。任何一个偶数都可以分解为两个素数之和。(其实这是个C二级考试的模拟试题)
 
 
20、快速排序(东软喜欢考类似的算法填空题,又如堆排序的算法等)
 
 
21、2005年11月23日慧通笔试题:写一函数判断某个整数是否为回文数,如12321为回文数。可以用判断入栈和出栈是否相同来实现(略微复杂些),这里是将整数逆序后形成另一整数,判断两个整数是否相等来实现的。
 
 
22、删除字符串中的数字并压缩字符串(神州数码以前笔试题),如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N))
 
 
23、求两个串中的第一个最长子串(神州数码以前试题)。如"abractyeyt","dgdsaeactyey"的最大子串为"actyet"。
 
 
24、不开辟用于交换数据的临时空间,如何完成字符串的逆序(在技术一轮面试中,有些面试官会这样问)
 
 
25、删除串中指定的字符(做此题时,千万不要开辟新空间,否则面试官可能认为你不适合做嵌入式开发)
 
 
26、判断单链表中是否存在环(网上说的笔试题)

1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
 
 
 
2.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
 
 
 
3.预处理器标识#error的目的是什么?
 
 
 
4.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
 
 
 
5. 用变量a给出下面的定义 
a) 一个整型数(An integer)
b) 一个指向整型数的指针(A pointer to an integer) 
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) 
d) 一个有10个整型数的数组(An array of 10 integers) 
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)  f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) 
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) 
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )
 
 
 
6.关键字static的作用是什么?
 
 
 
7.关键字const是什么含意?
 
 
 
8.关键字volatile有什么含意 并给出三个不同的例子。
  1). 一个参数既可以是const还可以是volatile吗?解释为什么。
  2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:  
int square(volatile int *ptr) 
 { 
  return *ptr * *ptr; 
 }
 
 
9.嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
 
 
 
10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
 
 
 
11.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius) 
{  
double area = PI * radius * radius;   
printf(" Area = %f", area);   
return area;  
}
  
 
 
12.下面的代码输出是什么,为什么?   
void foo(void)  
{   
unsigned int a = 6;  
int b = -20;   
(a+b > 6) puts("> 6") : puts("<= 6"); 
 }
 
 
 
13.评价下面的代码片断:   
 unsigned int zero = 0; 
 unsigned int compzero = 0xFFFF; 
 
 
 
 
14.尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?
 
 
 
15.Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子: 
#define dPS struct s * 
typedef struct s * tPS;    
以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?
 
 
 
16.C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么? 
 int a = 5, b = 7, c; 
 c = a+++b;
 
 
 
 
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) 写出程序输出
b) 在一个可移植的系统中这种表达式是否存在风险?why?
 
 
 
2中断是嵌入式系统中重要的组成部分,这导致了许多编译开发商提供一种扩展:让标准C支持中断,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论以下这段代码。
__interrupt double compute_area(double radius)
{
double area = PI * radius *radius;
printf("nArea = %f", area);
return area;
}
 
 
 
3 C/C++基础知识问题
a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。
b) C语言中static关键字的具体作用有哪些 ?
c) 请问下面三种变量声明有何区别?请给出具体含义
int const *p;
int* const p;
int const* const p;
 
 
 
 
 
4 嵌入式系统相关问题
a) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。
b) 在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?
c) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?
 
 
 
 
 
5 设周期性任务P1,P2,P3的周期为T1,T2,T3分别为100,150,400;执行时间分别为20,40,100。请设计一种调度算法进行任务调度,满足任务执行周期及任务周期。
 
 
 
 
 
6 优先级反转问题在嵌入式系统中是一中严重的问题,必须给与足够重视。
a) 首先请解释优先级反转问题
b) 很多RTOS提供优先级继承策略(Priority inheritance)和优先级天花板策略(Priority ceilings)用来解决优先级反转问题,请讨论这两种策略。 
 

嵌入式软件工程师笔试题
1:设float a=2, b=4, c=3;,以下C语言表达式与代数式 (a+b)+c计算结果不一致的是 
A.(a+b)*c/2                  B.(1/2)*(a+b)*c 
C.(a+b)*c*1/2                 D.c/2*(a+b) 
 
2:为了向二进制文件尾部增加数据,打开文件的方式应采用 
A.″ab″         B.″rb+″       C.″wb″       D.″wb+″ 
 
 
3:下述程序执行后的输出结果是 
#include 
main() 
{ 
int x='f'; 
printf("%c\n",'a'+(x-'a'+1)); 
} 
A.g     B.h C.i  D.j 
 
 
 
4:C语言中,下列运算符优先级最高的是 
A.!  B.%  C.>>  D.= = 
5:数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。 
A.*a  B.a [ 0 ]  C.a  D.a++ 
 
6:执行语句“ k=7>>1; ”后,变量 k 的当前值是 
A.15  B.31  C.3  D.1 

7:定义函数时,缺省函数的类型声明,则函数类型取缺省类型 
A.void B.char C.float D.int 

8:若main()函数带参数,参数个数最多是 
A.0  B.1  C.2  D.3 

9:若有宏定义:#define MOD(x,y) x%y
则执行以下语句后的输出结果是
int a=13,b=94;
printf(″%d\n″,MOD(b,a+4)); 
A.5  B.7  C.9  D.11 

10:下列各个错误中,哪一个不属于编译错误 
A.改变 x 原值 3 为 5 ,写作“ x==5 ;” 
B.花括号不配对 
C.复合语句中的最后一条语句后未加分号 
D.变量有引用、无定义 

11:下列程序段运行后, x 的值是( ) 
a=1;b=2;x=0; 
if(!( -- a))x -- ; 
if(!b)x=7;else ++x; 
A.0 B.3  C.6  D.7 

12:设
#define N 3
#define Y(n) ((N+1)*n)
则表达式2*(N+Y(5+1))的值是 
A.42 B.48  C.54  D.出错 

13:若定义了char ch[]={″abc\0def″},*p=ch;则执行printf(″%c″,*p+4);语句的输出结果是 
A.def  B.d  C.e  D.0 

14:下列转义字符中错误的是 
A.′\000′ B.′\14′  C.′\x111′  D.′\2′ 

15:算术运算符,赋值运算符和关系运算符的运算优先级按从高到低依次为 
A.算术运算、赋值运算、关系运算 
B.算术运算、关系运算、赋值运算 
C.关系运算、赋值运算、算术运算 
D.关系运算、算术运算、赋值运算 

16:设#define N 3 
#define Y(n) ((N+1)*n) 
则表达式2*(N+Y(5+1))的值是 
A.42  B.48  C.54  D.出错 

17:表达式 strcmp( “ 3.14 ”,“ 3.278 ” ) 的值是一个 
A.非零整数  B.浮点数  C.0  D.字符 

18:设struct 
{ short a; 
char b; 
float c; 
}cs; 
则sizeof(cs)的值是 
A.4  B.5  C.6  D.7 

19:若变量已正确定义,表达式( j=3 , j++ )的值是 
A.3  B.4  C.5  D.0 

20:C 语言中运算对象必须是整型的运算符是 
A.%  B./ C.!  D.** 

简答题

21:打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,... 
例子:当N =5,打印出下面的图形: 
X X X X X 
X Y Y Y X 
X Y 0 Y X 
X Y Y Y X 
X X X X X
 
 
 
22:谈谈COM的线程模型。然后讨论进程内/外组件的差别。 
 


23:多态类中的虚函数表是Compile-Time,还是Run-Time时建立的? 

 
 
 
24:#include 

  void main() 

  { int c; 

  while ((c=getchar())!= ′\ n ′ ) 

  switch(c - ′ 2 ′ ) 

  { case 0: 

  case 1:putchar(c+4);break; 

  case 2:putchar(c+4);break; 

  case 3:putchar(c+3);break; 

  default:putchar(c+2);break; 

  } 

  printf( ″\ n ″ ); 

  } 

运行时输入: 2473 ,输出结果:
 
25:用两个栈实现一个队列的功能? 
 

26:写一语句实现x是否为2的若干次幂的判断。
 
 
 
27:解二次方程:a*x*x+b*x+c 

28:如何判别一个数是unsigned。 
 
29:执行下述程序的输出结果是             。
#include 
char b[]="ABCDEF"; 
main() 
{ 
char *bp; 
for (bp=b;*bp;bp+=2) 
printf("%s",bp); 
printf("\n"); 
} 

30:已知一个数组table,用一个宏定义,求出数据的元素个数。
 

 1.将一个链表逆序

2、计算一个字节里(byte)里面有多少bit被置1

3.在一个字符串中找到可能的最长的子字符串

4.字符串转换为整数

5.整数转换为字符串
 
6、将一个字符串逆序
 
第1题: 考查对volatile关键字的认识
#include

static jmp_buf buf;

main()    
{
    volatile  int b;
    b =3;
    
    if(setjmp(buf)!=0)
    {
        printf("%d ", b); 
        exit(0);
    }
    b=5;
    longjmp(buf , 1);
} 

请问, 这段程序的输出是
(a) 3      (b)5         (c) 0         (d) 以上均不是

第2题:考查类型转换
main()
{
   struct node 
   {
       int a;
       int b;
       int c;     
   };
   struct node  s= { 3, 5,6 };
   struct node *pt = &s;
   printf("%d" ,  *(int*)pt);
}
这段程序的输出是:(a) 3(b) 5(c) 6(d) 7
第3题:考查递归调用
 
int  foo ( int x , int  n) 
{
    int val;
    val =1;
    
    if (n>0) 
    {
        if (n%2 == 1)  val = val *x;
        val = val * foo(x*x , n/2);
    }
    return val;
}

这段代码对x和n完成什么样的功能(操作)?(a) x^n (x的n次幂)(b) x*n(x与n的乘积)(c) n^x(n的x次幂)(d) 以上均不是

第4题:考查指针,这道题只适合于那些特别细心且对指针和数组有深入理解的人
 
main() 
{
    int  a[5] = {1,2,3,4,5};
    int *ptr =  (int*)(&a+1);
    
    printf("%d %d" , *(a+1), *(ptr-1));
}

这段程序的输出是:
(a) 2 2(b) 2 1(c) 2 5(d) 以上均不是

第5题:考查多维数组与指针
void foo(int [][3]);     

main()
{
    int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}};
    foo(a);
    printf("%d" , a[2][1]);
}

void foo(int b[][3])   
{
    ++ b;
    b[1][1] =9;
}
这段程序的输出是:(a) 8(b) 9(c) 7(d)以上均不对

第6题:考查逗号表达式
 
main()
{
    int a, b,c, d;
    a=3;
    b=5;
    c=a,b;
    d=(a,b);
    
    printf("c=%d" ,c);
    printf("d=%d" ,d);
}

这段程序的输出是:
(a) c=3 d=3(b) c=5 d=3(c) c=3 d=5(d) c=5 d=5

第7题:考查指针数组
main()
{
    int a[][3] = { 1,2,3 ,4,5,6};
    int (*ptr)[3] = a;
    
    printf("%d %d ", (*ptr)[1], (*ptr)[2]);

    ++ptr;
    printf("%d %d" , (*ptr)[1], (*ptr)[2]);
}
这段程序的输出是:
(a) 2 3 5 6(b) 2 3 4 5(c) 4 5 0 0(d) 以上均不对
第8题:考查函数指针
int *f1(void)
{
    int x =10;
    return(&x);
}

int *f2(void)
{
    int*ptr;
    *ptr =10;
    return ptr;
}

int *f3(void)
{
    int *ptr;
    ptr=(int*) malloc(sizeof(int));
    return ptr;
}
 
上面这3个函数哪一个最可能引起指针方面的问题
(a) 只有 f3(b) 只有f1 and f3(c) 只有f1 and f2(d) f1 , f2 ,f3