zoukankan      html  css  js  c++  java
  • 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);
    }

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

  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/xiaoxing/p/4043317.html
Copyright © 2011-2022 走看看