• 测试题


    一:填空(共28分)

    1.(2分)struct AA{

    char a;//0

    char b[2];//1,2

    short c;//4 5

    int d; //8 9 10 12

    };  

           请问sizeof(struct AA)是___12_结构体起始地址就是第一个成员的起始地址__。

     

       2. (2分 )struct BB{

    char a;//0

    short b[2];//2,3,4,5

    char c;//6

    int d;//8,9,10,11

    };  

    请问sizeof(struct BB)是___12___。

     

       3. (6分)  

       int *p = NULL;

           int main()

           {

    int i = 3;

    static int a = 5;

    int *p1= NULL;

    p = &a;

    *p = i;

    p1 = (int *)malloc(5 *sizeof(int));

    i++;

     

    printf(“%d, %d ”, a, i);

    return 0;

           }

    在32位系统中,内存分为:数据域,栈,堆等。则指针变量p,p1所指向的区域分别存储在(.data),(堆区);变量 i,a分别存储于(栈区),(.data);printf打印的结果(3),(4);

    栈区:函数参数,动态局部变量;

    堆区:动态内存;

    数据域:全局变量,和静态局部变量

    文字常量区:常量字符串

    程序代码区:函数体的二进制代码

     

     

    4.(2分)const的用法,至少两种?

    1.修饰函数参数,表明这个参数不可更改。

    2.修饰普通变量,表明此变量不可更改。

    3.修饰指针变量。(详见博客const

     

     

    1. (2分)  static的用法,至少两种?

    1限定变量的作用域 2.改变变量的生存期(存储域)

     

    6.(4分)1)定义一个3列4行int类型元素数组;

            int a[4][3];

                2)一个指向函数的指针,该函数有一个void型 指针参数并返回一个void型指针;void*p*)(void*

     

      7.(4分)32位系统中char*p = NULL;int a[10] = {0};假设     int  a[10]变量的起始地址是0x10000;指针变量(本身)的地址是 0x20000;char *p = (char *)a; 则:

           p+1值(0x10001);&p+1值:(0x20004);//p的地址的值加1

     

    a+1值: (0x10004);  

    &a+1值: (0x10028);//&a相当于存放a  数组指针 的地址,指向该数组之后的空间

     

     

    8.(2分)写出float x与“零值”的比较( if(x<0.000001)&&(x>-0.000001) )。

     

    9.(2分)使用宏定义写出int类型最大值。

    #define  INT  ~(1<<(sizeof (int)*8-1))

    #define INT_SIZE  ((unsigned int)~0)>>1

     

    10.(2分)以下程序是否有误,如果无误,请写出执行次数(  1)。

    int x = -1;

    do{

    x = x * x;

    }while(!x);

     

     

     

     

    二:判断(共10分)

    1(1分)#include<stdio.h>  

    int main(void) {     

    char *ptr = "Linux";     

    *ptr = 'T';      

    printf("  [%s]  ", ptr);      

    return 0; 

    }.  

    程序输出 Tinux:

    //字符串常量不可改变,段错误

    2(1分)定义一个指针变量,该指针变量指向一个具有10个整型指针元素的数组是: int *  array  [10];

    int**arry[10];

    3(1分)以下都是正确的标识符:Char, Short, If,CASE.

    //标识符都是用户自己定义的,不能是系统定义的关键字,系统区分大小写

    4(1分)有语句char str1[10],str2[10]={"china"};则能将字符   串china赋给数组str1的正确语句是strcpy(str2,str1)

    strcpystr1str2//碰到‘’字符结束,源字符串作为后面的参数

      5.(1分)在大端系统中,int类型的1内存中存储的是0x1在   高字节。//0x1 是低字节数据,在大端系统中存放在高字节内存中

      6.(1分)有数组定义inta[2][3] = {{1}, {2,3}};则a[0][1]的值 为0. 

      7.(1分)声明函数int fun(int a[10]);则a表示一维数组变量名。错

    一维数组做函数参数,数组名仅仅代表一个地址,不代表数组?怎么表述

      8.(1分)char *p = “hello”,  char str[] = “hello”;表示指针变量 p和str 都指向文字常量“hello//p指向文字常量区,而str指向栈区,系统在栈区分配了一段内存空间存放从文字常量去复制的字符串“hello

      9(1分)程序的局部变量都存放在栈中。静态局部变量在数据域中

     10(1分)switch(c)语句中c可以是int, float, char, long    类型。//float 不可作为c放在switch()的小括号内

     

    三:(36)语法及分析

    1.(2分)写一个宏,求之中比较大的数:________.

    #define  MAXab)  (a>b)  ? a:b;

    2. (2分)写一个宏判断一个变量是不是无符号数:________. 

    #define  SIGNEDval) (val<0) ? 1:((~val>=0)?0:1 )

    3.(2分)下面的语句输出的结果是____c语言没有规定计算顺序,answer的值不定,*p = 4,在可移植操作系统中有什么问题___不同的编译平台_answer的值不定_(-5)___。

    #include <stdio.h>

    int *p = NULL;//

    int func ( void ) {

    static int counter = 1;//静态变量在循环函数里面只会被初始化一次

       P = &counter;

    return counter++;//先返回counter的值然后执行++

    }

    int main ( void ) {

    int answer;

    answer = func() - func()*func();

    printf("%d, %d ",answer, *p);

    return 0;

    }

     

     

    4.(2分)下面函数定义有没有错误或者漏洞?如果有,如何修改?

    #include <stdio.h>

    void showArray( int array [10] ) {//数组指定大小没意义

    int i;

    for (i = 1; i< 10; i+=1)

    if ( array[i] >10 ) 

    printf("%d ",array[i]);

    }    

    5.(2分)下面函数定义有没有错误或者漏洞?如果有,为什么,如何修改?             

    int main()

    {   

                char a[5];//长度太短    

              char *str = a;  

                strcpy(str,"hello");    

              printf(str);//双引号也是相当于一个字符串的首地址开始打印和指针一个效果

       //printf (“%s ”,str);   

              return 0;         

      }

    6.(2分)请问下面的代码的输出结果是

    #include <stdio.h>

    int main ( void ) {

    int i = 6;

    int a[5] = {1,2,3,4,5};

    char * p = (char * )(&a +1);//&a+1相当于指向了a数组的后面一个内存单元。因为p指向的内存单元存放的是char类型数,所以p-1指向a[4]的高字节

    printf("%d,  %d",*(a+1),*(p-1));//2 , 0

    }

    7.(2分)请问下面的代码的输出结果是

     int main(){

    int a[6],*i,*p=a,*t=a;

    printf("qing shu ru shu ju: ");

    for(i=a;i<a+6;i++){

    scanf("%d",i);

    }

            for(i=a;i<a+6;i++){

      *p=*i+*t;

      printf("%4d",*p);

      }

     }

     输入:1 2 3 4 5 6

     输出:2 3 4 5 6 7

    8(2分)请问下面的代码的输出结果是

    int main ( void ) {

    unsigned int a = 6;

    int b = - 20;

    (a+b)>0?puts(">0"):puts("<=0");//类型转换

    }

    >0

     

       9.(2分)

    #define N 2

         #define NTI(n)  N*n + n

    int sum = N * NTI(N + 1);

    问sum为多少(12)。

    10.4分)写出下列程序输出结果(  )

    #include <stdio.h>

    int count 1= 3; 

    int main() 

    int i, sum, count2 = 2; 

    for(i = 0, sum = 0; i < count2; i += 2,count2++) //2ci xp hr

    static int count 3; //静态变量的定义语句只能执行一次   count3 = 4

    count3++; 

    if(i % 2 == 0) 

    extern int count1; //extern限定count1引用的是函数外部,或文件外部的同名变量。Int不可少,防止变量类型重置。

    count1++; 

    sum  += count1; 

    sum += count3; 

    printf("%d, %d ", count2, sum);

     

    return 0; 

    }   

     

     

     

    11.6分)写出下列程序执行结果 ( )。(注,此处按行评判给分)

    #include <stdio.h>

    #include <string.h>

    void func(char str[50])  

    {  

      printf("%d, %d ", sizeof(str), strlen(str)); //4传过来一个指针,

    9指向的字符串从指向的地方开始到结束的长度,不包括‘

    }  

    int main()  

    {  

      char stra[] = "HelloWorld"; //strlenstra)10 sizeofstra=11;

    数组名代表整个数组的长度。

      char *strb = stra; //字符串数组可以直接赋给一个字符指针。 

    printf("%d, %d ", sizeof(stra), sizeof(strb++));//11,4sizeof()里面的表达式永不执行。

     

      func(++strb); //4,9,先把strb变量的值加1,就是指向字符串中的e

    printf("%d, %d ", sizeof(strb), strlen(strb++));//4,9

      return 0;  

    12.(4分)写出下列程序输出结果(01209)

     

    int func(int n)  

    {  

       int k = 1;  

       if(n > 0)  

       {  

      k += func(--n);  

    printf(“%d”, n);  

    k += func(--n);  

       }  

       return k;  

    }  

    int main()  

    {  

      int a = 3;  

      printf(“%d ”, fun(a)); 

      return 0;  

    }  //

     

     

    13.(4)写出下列程序输出结果()

    #include <stdio.h>

    struct SC{int a,b,c;};  

    struct SD{int a,b,c,d;};  

    int main()  

    {  

      struct SC c1[] = {{3,0,0}, {4,0,0}, {5,0,0}, {6,0,0}};  

      struct SD *c2 = (struct SD*)c1 + 1;  

      printf("%d,%d,%d,%d ",c2->a,c2->b,c2->c,c2->d); //0 0 5 0

      return 0;  

    }  

     

     

     

     

     

  • 相关阅读:
    【Leetcode】92. Reverse Linked List II && 206. Reverse Linked List
    【Leetcode】91. Decode Ways
    记一次面经
    涨知识
    B-Tree 漫谈 (从二叉树到二叉搜索树到平衡树到红黑树到B树到B+树到B*树)
    涨知识
    HDU 1754 I Hate It 【线段树单点修改 维护区间最大值】
    POJ 1632 Vase collection【状态压缩+搜索】
    POJ 1011 Sticks 【DFS 剪枝】
    POJ 1088 滑雪 【记忆化搜索经典】
  • 原文地址:https://www.cnblogs.com/vhwuln/p/3482206.html
Copyright © 2020-2023  润新知