Q&C语言试题 | 檐下窗棂斜映枝桠
Cobb 721 1

一. 选择题(每题5分)

1.
int fun(int m)
{
    static  int  temp=0;
temp+=m;
return  temp;
}
void main()
{
    int  i=0;
    int  ret=0;
    for(i=0; i<3; i++)
{
        ret=fun(i);
}
printf(“%d \n”, ret);
}
请选择正确的输出结果:
A.1         B.2         C.3         D.4

解析: 静态局部变量的生命周期是整个周期,
保存的数据不会被清零。

------------------------------------------------------------------------------
2.
int  x=5;
void main()
{
    int  s=10;
    {
        int  x=2;
        x+=s;  // ::x 表示全局
}
x+=s;
printf(“%d \n”, x);
}
请选择正确的输出结果:
A.15         B.22          C.12       D.24
解析:作用域不同,可定义相同的变量,就近原则。

------------------------------------------------------------------------------
3.
#define FUNC(x,y)     (x>y)?’a’:’b’
int  main()
{
    unsigned int  a=1;
    char  b=-1;
    char  c=0;
c=FUNC(a,b);
printf(“%c \n”, c);
return 0;
}   
请选择正确的输出结果:
A.a         B.b      C.’a’       D.’b’

解析:格式化没有加 ‘’,
运算的参与运算的类型必须保持一致,
类型不一致的时候,会做类型转换。
(小类型 - > 大类型; 有符号 - > 无符号)

Short,char -> int -> long -> unsigned -> double 
-1                      负数就变成正数了         
1111 1111 1111……


------------------------------------------------------------------------------

4.
#define MAX(x)  (12>x>2)?(x+2):(x+4)
int main()
{
    int a=0;
    int b=0;
    a=10;
    b=MAX(a);
    printf(“%d ”, b);
    b=MAX(a)+4;
    printf(“%d ”, b);
    return 0;
}   
请选择正确的输出结果:
A.14 18     B.14 14      C.18 18    D.18 14

解析: 运算符
------------------------------------------------------------------------------

5.
#define FUNC(a, b) \ 
    a++;\
    ++b;
int main()
{
     int a=2;
    int b=4;
    int i=0;
    for(i=0; i<2; i++)
        FUNC(a, b)
    printf(“%d %d\n”, a, b);
    return 0;
}
请选择正确的输出结果:
A.4 5     B.4 6      C.4 4   D.5 6

解析: \ 后面不允许有空格
宏展开,for 后只有a++循环了两次;


------------------------------------------------------------------------------
6.
int main()
{
    int a[]={23,5,87,11,5};
    int *p=NULL;
    p=a;
    printf(“%d \n”, *(p+2));
    p=(int *)(&a+1);
    printf(“%d \n”, *(p-2));
    return 0;
}
请选择正确的输出结果:
A.5 5     B.5 11      C.87 5   D.87 11

------------------------------------------------------------------------------

7.
int main()
{
void GetMemory(char *p)
{
    p = (char*)malloc(20);
}
void main()
{
char *p = NULL;
GetMemory(p);
strcpy(p, “hello world”);
printf(“%s”, p);
}
请选择正确的输出结果:
A.hello world     B.乱码     C.hello   D.段错误

解析:去画调用栈

------------------------------------------------------------------------------

二.填空题 (每题5分)


------------------------------------------------------------------------------
1.
int main()
{
    int a[]={2,3,2,3};
    int *ptr1=(int *)(&a+1);
    int *ptr2=(int *)((int)a+1);
    printf(“0x%x 0x%x \n”, ptr1[-1], *ptr2);
    return 0;
}
请写出程序的输出结果:___0x3__     __0x3000000___(6个0)

02 00 00 00        // 右移1位,第二个先是数学运算,后取
03 00 00 00        //  4 个位,小端模式,高地址
 // 存高字节(正常反向取)

------------------------------------------------------------------------------
2.
typedef  int (*FUNC1)(int);
typedef  int (*FUNC2)(int*, int*, int*);

int inc(int a)
{
    return ++a;
}
int multi(int *a, int *b, int *c)
{
    return *c=*a**b;
}
void show(FUNC2 func, int arg1, int *arg2)
{
    FUNC1 p=inc;
    int temp=p(arg1);
    func(&temp, &arg1, arg2);
    printf(“%d\n”, *arg2);
}
int main()
{
    int a;
    show(multi, 10, &a);
    return 0;
}
1.请写出程序的运行结果:__110
___


------------------------------------------------------------------------------

3.
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问
p1+5=__0x801005__ p2+5=____0x810014_____

解析:   (1*5)            (地址偏移 4*5 )
1 指针指向
2 类型
------------------------------------------------------------------------------

4.
struct Test
{
    int Num;
    char *pcName;
    short sDate;
    char ch;
}*p;

假设p的值为0x2000,下面表达式的值为:
p+0x1=__0x200C (指针偏移,指针类型struct ,12 )
(unsigned long)p+0x1=__0x2001__ (值的运算)
(unsigned int *)p+0x1=__0x2004__(指针偏移)

解析: 画出内存结构 3个int


------------------------------------------------------------------------------

三.简答题(每题10分)

1.画出x86 32位系统下,进程的虚拟地址空间布局,明确标识出.text .data、堆、栈、user space和kernel space的范围。

2.简述C/C++程序的编译、链接原理。

编译阶段:
1、预处理阶段:删除代码注释,处理#开头的指令等
2、编译阶段:语法、词法、语义分析,代码优化等
3、汇编阶段:把汇编代码,转换成本地平台的机器码
生成二进制可重定向文件.obj   .o

链接阶段:
1.所有obj文件的segment进行合并,合并符号表,确保每个符号都有一个定义,给符号分配虚拟地址
2.符号的重定向(在.text段,把符号的无效地址替换成符号正确的虚拟地址)

四.代码题,每题10分


1.实现以下函数接口,参数传入一个数字字符串如”3456”,转换成十进制的整数并返回。
int ConvertStringToDigit(const char *str)
{
}



2.实现以下函数接口,判断参数传入的字符串是否是回文,是返回true,否则返回false(注:回文字符串是正反读都是一样的字符串,如”abcdfdcba”):
bool IsPalin(const char *str)
{
}


3. 完成接口,判断系统的大小端模式,小端模式返回0,大端模式返回1.
int GetCurrentSysMode()
{
}

解析:
法一: 联合体,共享内存
法二: 指针取整形的第一个位也行

评论区

索引目录