语言部分:语言部分
一、简单编程,请用一句语句完成下列操作
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;
- }