• c语言笔试题(带答案)


    填空:

    1,short int a[10]={123, 456, 789}; sizeof(a)=  20    ;short int *p=&a, 则sizeof(p)=  8

    对于64位机来说,指针为8字节表示。其中

    sizeof是一运算符返回编译器为其分配的数组空间大小,不关心里面存了多少数据sizeof几种情况:

    数组——编译时分配的数组空间大小;
        指针——存储该指针所用的空间大小(存储该指针的地址的长度,  是长整型);
        类型——该类型所占的空间大小;
        对象——对象的实际占用空间大小;
        函数——函数的返回类型所占的空间大小。函数的返回类型不能  是void。
    strlen是一函数,只接受char*类型变量,返回字符串的实际长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'',返回的长度大小不包括''。

    详细参考:strlen和sizeof的区别

     

    2,给一整形变量n(32bit),把n的bit5(bit0开始)置1,其他不变:n |= (1<<5)             

    位操作之中时常用到与(&),或异(^),或(|),其中:

    (1)与1相异或(^)运算将取反

    (2)与1相或(|)运算将被置1

    (3)与1相与(&)运算将保持不变

    (4)取反运算符~,将数0-->1,1-->0

    (5)右移(>>)  左移(<<)

     

     3,int fun(int* x, int *y){……} 则:怎么用函数指针p调用fun?

    void main()

    {    int a=1, b=2;

         int (*p)(int *, int *);      

         p=fun;  p(&a, &b);

     }

    函数指针,本质是指针,表示为 int (*p)(int *, int *)

    指针函数,本质是函数,表示为 int *p(int *, int *)

    4,定义一个宏,将内存的大小由MB转换为bit:#define MB_TO_BIT(x) ((x)*1024*1024)ul            

    5,如图,p,q节点指向,插入q,则: 

    viod add(node* head, int a)
    
    {  …
    
      node *p = head->next;
    
      node *q = (node *)malloc(sizeof(node));
    
      q->data = a;
    
      q->next = p->next;  
    
      p->next=q;  
    
     }

    技巧是不能够把p和后一节点先断开,否则将不能寻找到后一节点。

    6,由char a=253; int b = a; int c = a&0xff; 则:b=-3  ,  c=253 ;

    其中:a为有符号数,最高位是1,余下7位,范围-128~127,253表示为-3 

    7,用define实现,将整数x,y连接形成整数并除以y,如:F(12, 34, 56) = 1234/56,则:#define F(x,y,z) ((x)##(y)/(z));

    注意:宏之中’#’  ‘##’区别,

    (1)‘#’是把宏参数转换为字符串,如:

    #define PSQR(x) printf(“ ”#x”=%d ”, ((x)*(x)))

    则 y=5,PSQR(y)将输出 y=25;

       x=2+4, PSQR(x)将输出 2+4=36

    (2)’##’粘合剂,如:

    #define XNAME(n)  x##(n) 则

     XNAME(4)将表示为 x4

    选择:

    1,找不正确选择(A)

    A, char a[8]={‘a’,’b’,’c’,}   B, char a[8]; a=”hello”;

    C, char a[]=”abc”;          D, char a[8]={’a’,’b’,’c’,’’};

    2,#define M(x, y, z)  x*y+z, 则a=1, b=2, c=3结果输出

    M(a+b, b+c, c+a)=  (D)      

    A, 19   B,17  C,15  D,12

    宏只是简单的替换,不会计算出a+b, b+c, c+a中的结果。所以M(a+b, b+c, c+a)=1+2*2+3+3+1。

    需要改进为:#define M(x, y, z)  ((x)*(y)+(z))

    3,由char aa=500; int bb=aa;则 printf(“%d ”, bb+1)的结果(C)

    A, 编译报错   B,245  C,-11  D,-1

    由于char类型表示范围为-128~127,所以aa值为-12,所以bb+1=-11

     

    4,char a[] = {’i’, ’n’, ’n’, ’’, ’s’}; char b[] = {’i’, ’n’, ’n’, ’s’ ,’’};

    int x1=sizeof(a), int x2=strlen(a), int x3=sizeof(b), int x4=strlen(b)

    问:X1=         X2=        X3=        X4=     ;(A)    

    A,5 3 5 4    B,5 5 5 5  C,5 5 6 5   D,3 3 5 5

    sizeof计算出编译器为数组分配内存大小,strlen接受char*类型变量,遇到’’结束,计算数据实际存储的数据。

    详细参考:strlen和sizeof的区别

    5,函数递归,求f(2, 3)=  D          

    int f(int x, int y)
    
    {
    
    if(x==0)  return y+2;
    
    if(y==0)  return f(x-1, 1);
    
    return f(x-1, f(x, y-1));
    
    }

    A,4   B,16  C, 31  D,61

     

    5, 下列程序可能运行结果()(多选)

    #include <stdio.h>
    #include <unistd.h>
    int main (int argc, char **argv)
    {  
        int cnt=2;
        pid_t pid;
    
        if((pid=fork())==0)
            cnt++;
        else
            cnt--;
        printf("
    %d
    ", cnt);
    
        return 0;
    } /* ----- End of main() ----- */ 

    A,3     B,31     C,1      D,13

    结果:A和C

    简答:

    1,用c变函数,实现一个字符高低位互换,比如0x3A-->0xA3

    char change (char num)
    {
    
        char temp=num;
    
        temp  &= 0x0f;
    
        temp  = temp<<4;
    
        num  &= 0xf0;
    
        num  = num>>4;
    
        temp  = (num|temp);
    
    
        return temp;
    
    } /* ----- End of change()  ----- */

    2,字符逆序存储,如abcdefgh->hgfedcba

    char *reverse (char *s)
    {
      char *head = s;
      char *end = s;
    
    /*end定位到字符串尾*/
    #if 1
    while (*(end + 1) != '')   ++end ; #else   while( *end )     ++end;   end--; #endif

    while(end > head) {   char temp=*head;   *head++ = *end;   *end-- = temp; } return s; } /* ----- End of reverse() ----- */

    详细参考:字符串面试题(一)字符串逆序

    3,字符串s,t, 将t插入s,其中假设s有足够空间容纳t

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 100
    
    int insert_pos (char *src, char *dst, int pos)
    {
    
        char temp[MAX];
        int loc=stlren(src);
    
      if(pos < 0)
       {
            printf("position  needs to big than or equal to 0
    ");
            return -1;
       }
    
    /* 插入位置超过被插字节串长度 */
    if(loc<=pos) { strcat(src, dst); }
    /*正常插入字符串中间*/
    else {    memset(temp, 0, 100); strcpy(temp, src+pos); strcpy(src+pos, dst); strcat(src, temp); } return 0; } /* ----- End of insert_pos() ----- */ int main (int argc, char **argv) { char a[]="abghij"; char b[]="cdef"; int pos; printf("position: "); scanf("%d", &pos); if( -1==insert_pos(a, b, -1) ) return -1; printf("%s ", a); return 0; } /* ----- End of main() ----- */

    4,单链表L,头指针为phead,判断其是否有环?            

    bool isExitsLoop(list *head)
    {
        list *slow = head, *fast = head;
    
        while ( fast && fast->next ) 
        {
            slow = slow->next;
            fast = fast->next->next;
            if ( slow == fast ) break;
        }
    
        return !(fast == NULL || fast->next == NULL);
    }

    详细参考:判断单链表是否存在环及求环入口点

  • 相关阅读:
    JAVA传值与传址
    JAVA中的栈和堆
    for语句输出图形
    Linux下ps命令详解(转载)
    BMC介绍
    JVM 优化、内存泄露排查、gc.log 分析方法等(转载)
    动态从zookeeper读取kafka信息
    centos 查看文件系统类型
    TCPdump抓包命令详解
    Linux Tab键自动补齐
  • 原文地址:https://www.cnblogs.com/xiaoxing/p/4043317.html
Copyright © 2020-2023  润新知