c语言面试题

语言部分:语言部分

一、简单编程,请用一句语句完成下列操作

1.     位操作:将变量unsigned long register的0,4,6位清0

 32位下:register&=0xffffffae

分析:0,4,6清0;10101110对应着:1010对应a; 1110对应e

2.     字符串操作:判断字符串char* str1是否起始位置包含char* str2的内容

if(strstr(str1,str2)==str1)

3.     内存操作:将指针unsigned char* ptr的内容向后移动4个字节

*(ptr+4)=*ptr;

4.将无符号变量unsigned int val进行字节序颠倒

(val&0x000000ff<<24)|( val&0x0000ff00<<8) |( val&0x00ff0000>>8)| ( val&0xff000000>>24)

二、写出下列程序的运行结果 32位

1、指针变量:

Unsignedchar*p1;

Unsignedchar*p2;

p1=(Unsigned char*)0x801000;

p2=(Unsigned char*)0x810000;

请问:p1+5=?  p2+5=?

p1+5=0x801000+5*4=0x801000+0x14=0x801014

p2+5=0x810005+5*4=0x810000+0x14=0x810014

2.算数运算

Main()

{

Unsignedchar a,b,c,d;

a=30;

b=a++;

c=++a;

d=10*(a++);

}

请问:b=?c=?d=?

b=30,c=32,d=3200

3、逻辑运算

unsigned int regval = 0x451AD,evenMask= 0x306,bitConvert = 0xFF;

    int event = 0,convert = 0;

    event = regval& bitConvert;

    convert = regval^ convert;

请问:event=?   Convert=?

event= 260  Convert=282962

分析:event=0x451AD&0x306

0x 4 5 1 A D

& 0x     3 0 6

= 0x 0 0 1 0 4 即:16*16+4=260

convert = 0x451AD ^ convert;

 

三、请指出下列程序存在的问题,如何修正:

1、说明:以下代码是把一个字符串倒序,如”abcd”倒序后变为”dcba”

int _tmain(intargc, _TCHAR*argv[])

{

    char*src = "hello,world";

    char *dest = NULL;

    intlen = strlen(src);

    char*dest = (char*)malloc(len);

    char*d = dest;

    char*s = src[len];

    while(len-- != 0)

    {

         d++= s--;

}

    printf("%s",dest);

    return0;

}

正确应该为:

[cpp]  view plain  copy
  1. #include "string"  
  2.   
  3. #include <iostream>  
  4.   
  5. using namespace std;  
  6.   
  7.    
  8.   
  9. int _tmain(intargc, _TCHAR*argv[])  
  10.   
  11. {  
  12.   
  13.     char*src = "hello,world";  
  14.   
  15.     char*dest = NULL;  
  16.   
  17.     int len = strlen(src);  
  18.   
  19.     dest= (char*)malloc(len+1); //要为\0分配一个空间  
  20.   
  21.     char* d = dest;  
  22.   
  23.     char* s = &src[len-1];     //指向最后一个字符  
  24.   
  25.     while(len-- != 0)  
  26.   
  27.     {  
  28.   
  29.          *d++= *s--;  
  30.   
  31.          *d=0;                      //尾部要加上\0  
  32.   
  33.     }  
  34.   
  35.     cout<<dest<<endl;  
  36.   
  37.     system("pause");  
  38.   
  39.     free(dest);                   //使用完,应当释放空间,以免造成内存泄露  
  40.   
  41.     return0;  
  42.   
  43. }  


 

方法二:

[cpp]  view plain  copy
  1. int _tmain(intargc, _TCHAR*argv[])  
  2.   
  3. {  
  4.   
  5. char str[]="hello,world";  
  6.   
  7.     int len = strlen(str);  
  8.   
  9.     char t = 0;  
  10.   
  11.     int i;  
  12.   
  13.     for(i=0;i<len/2;i++)  
  14.   
  15.     {  
  16.   
  17.          t=str[i];  
  18.   
  19.          str[i]=str[len-i-1];//不要忘怀多减一个,重视数组的下标  
  20.   
  21.          str[len-i-1]=t;  
  22.   
  23.     }  
  24.   
  25.     cout<<str<<endl;  
  26.   
  27.     system("pause");  
  28.   
  29.     return0;  
  30.   
  31. }  


 

四、简答题:

1、头文件的ifndef/define/endif干什么用的?

防止头文件被重复引用

2、定义函数局部变量的时候:

Char array1[100];

Char *array2;

array1和array2都可以当做指针引用,这两个指针在使用的时候有什么区别?

当做函数参数传递的时候,数组可以当指针用,本质就是取数组第一个元素的内存地址传过去,当数组作为函数参数传递的时,该数组自动退化为同类型的指针。

指针也可以当数组用,但是两者的本质不一样;

数组名对应着一块内存,而不是指向一块内存,其地址和容量在生命周期不变,但数组内容可以改变;

指针可以随时指向任意的内存块,其特征是可变,常用指针来操作动态内存。

五、内存问题:

 很简单,不详述。

六、程序编写:

编写一个函数,输入参数为一个字符串指针,将其中的大写变为小写

[cpp]  view plain  copy
  1. char* Atoa(char str[])  
  2.   
  3. {  
  4.   
  5.     for(int i=0;str[i]!='\0';i++)  
  6.   
  7.     {  
  8.   
  9.          if(str[i]>='A' && str[i]<='Z')  
  10.   
  11.              str[i] += 32;  
  12.   
  13.     }  
  14.   
  15.     returnstr;  
  16.   
  17. }  
  18.   
  19. int _tmain(intargc, _TCHAR*argv[])  
  20.   
  21. {  
  22.   
  23. char str[100]="Hello,World";  
  24.   
  25.   Atoa(str);  
  26.   
  27.   cout<< str;  
  28.   
  29. return 0;  
  30.   
  31. }  



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值