swap(int* p1,int* p2 )
{
int *p;
/*p= NULL,NULL就是一个宏定义的0,但是不能够往*p里面写东西,因为这个是个常量,不能够给常量赋值*/
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在vc++中debug运行时提示错误“access violation”。该程序应该改为:
swap(int* p1,int* p2 )
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}
2.分别给出bool,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)
解答:
bool型变量:if(!var)
int型变量:if(0==var)
float型变量:
const float epsinon = 0.00001;
if ((x >= - epsinon) && (x <= epsinon)
指针变量: if(var==null)
剖析:
考查对0值判断的“内功”,bool型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。
一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==null),这是一种很好的编程习惯。
浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则判为错,得0分。
3.请计算sizeof的值
void func ( char str[100] )
{
sizeof( str ) = ?
}
void * p = malloc( 100 );
sizeof( p ) = ?
charstr[10];
cout<< sizeof(str) << endl;
解答:
……
sizeof(str ) = 4
sizeof( p ) = 4
sizeof(str) = 10
4.写一个“标准”宏min,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?
least= min(*p++, b);
解答:#definemin(a,b) ((a) <= (b) ? (a) : (b))
min(*p++, b)会产生宏的副作用
5.编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefg”
函数头是这样的:
//pstr是指向以'\0'结尾的字符串的指针
//steps是要求移动的n
void loopmove ( char * pstr, int steps )
{
//请填充...
}
解答:正确解答1:
void loopmove ( char *pstr, int steps )
{
int n = strlen( pstr ) - steps;
char tmp[max_len];
strcpy ( tmp, pstr + n );
strcpy ( tmp + steps, pstr);
*( tmp + strlen ( pstr ) ) = '\0';
strcpy( pstr, tmp );
}
正确解答2:
void loopmove ( char *pstr, int steps )
{
int n = strlen( pstr ) - steps;
char tmp[max_len];
memncpy( tmp, pstr + n, steps );
memncpy(pstr + steps, pstr, n );
memncpy(pstr, tmp, strlen(pstr));
}
6.堆和栈的区别?
栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap) -一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在序的整个运行期间都存在。例如全局变量,static 变量。
2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free 或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。
7.struct和class 的区别
答案:struct 的成员默认是公有的,而类的成员默认是私有的。struct 和class 在其他方面是功能相当的。从感情上讲,大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!)时,你也许应该使用struct 关键字,否则,你应该使用class 关键字。
8.下面代码输出结果为多少?
#include "stdafx.h"
#define SQR(X) X*X
int main(int argc, char* argv[])
{
int a = 10;
int k = 2;
int m = 1;
a /= SQR(k+m)/SQR(k+m);
printf("%d\n",a);
return 0;
}
这道题目的结果是什么啊?
宏替换:a /=2+1*2+1/2+1*2+1;a = 10/7 = 1;