题目来自互联网:http://wenku.baidu.com/view/1b71537201f69e314332947f.html
答案:自己做的,可能有错误,请多指正。 QQ:447872587
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;
}
正确应该为:
#include "string" #include <iostream> using namespace std; int _tmain(intargc, _TCHAR*argv[]) { char*src = "hello,world"; char*dest = NULL; int len = strlen(src); dest= (char*)malloc(len+1); //要为\0分配一个空间 char* d = dest; char* s = &src[len-1]; //指向最后一个字符 while(len-- != 0) { *d++= *s--; *d=0; //尾部要加上\0 } cout<<dest<<endl; system("pause"); free(dest); //使用完,应当释放空间,以免造成内存泄露 return0; }
方法二:
int _tmain(intargc, _TCHAR*argv[]) { char str[]="hello,world"; int len = strlen(str); char t = 0; int i; for(i=0;i<len/2;i++) { t=str[i]; str[i]=str[len-i-1];//不要忘怀多减一个,重视数组的下标 str[len-i-1]=t; } cout<<str<<endl; system("pause"); return0; }
四、简答题:
1、头文件的ifndef/define/endif干什么用的?
防止头文件被重复引用
2、定义函数局部变量的时候:
Char array1[100];
Char *array2;
array1和array2都可以当做指针引用,这两个指针在使用的时候有什么区别?
当做函数参数传递的时候,数组可以当指针用,本质就是取数组第一个元素的内存地址传过去,当数组作为函数参数传递的时,该数组自动退化为同类型的指针。
指针也可以当数组用,但是两者的本质不一样;
数组名对应着一块内存,而不是指向一块内存,其地址和容量在生命周期不变,但数组内容可以改变;
指针可以随时指向任意的内存块,其特征是可变,常用指针来操作动态内存。
五、内存问题:
很简单,不详述。
六、程序编写:
编写一个函数,输入参数为一个字符串指针,将其中的大写变为小写
char* Atoa(char str[]) { for(int i=0;str[i]!='\0';i++) { if(str[i]>='A' && str[i]<='Z') str[i] += 32; } returnstr; } int _tmain(intargc, _TCHAR*argv[]) { char str[100]="Hello,World"; Atoa(str); cout<< str; return 0; }