最近要开始找工作了,也打算看看C语言笔试的一些题目了,这些题目还是有点意思的,因为往往是我们初级程序员经常犯的错误BUG;
(1) 布尔值 :测试BOOL flag变量是否为真.应该这样:
if(flag);或者if(!flag);
(2) float :测试float flag变量是否为0.应该这样:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON));
(3)NULL:测试char *p 变量与“零值”比较.应该这样:
if(p==NULL);或者if(p!=NULL);不使用if(P==0,p!=0,p,!p)等等;就机器内部而言,NULL指针可以不同。在这种情况下,编译器负责将零值和内部值之间的翻译转化;
(4) const 有什么用?
定义常量;
修饰函数的参数和返回值,被修饰的东西收到强制保护,防止意外变动,提供健壮性;
(5) 指针传递问题,若想要引用传递,而不是值传递,那么传入的一定是地址,要么是指针本身的地址,要么是变量的地址;
(6)指针和引用的区别:
引用必须别被初始化,指针不必;
引用初始化以后不能被改变,指针可以;
不存在指向空值的引用,指针可以改变所指的对象;
(7) 全局变量和局部变量在内存中是否有区别?
全局变量存在静态数据区,局部变量在堆栈区;
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等
堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序 结束时可能由OS回
收
栈是一种线性结构,堆是一种链式结构;堆栈一般是指栈;
(8) printf计算参数时是从右到坐压栈的;
*(prt++)+=123;按照++规则,这里为先引用再++,所以为*ptr=*ptr+123;ptr++;
(9) char str[]="Hello";
char *p=str;
int n=10;
那么计算sizeof(str)=6;sizeof(p)=4;sizeof(n)=4;
void Func(char str[100])
{
sizeof(str)=4;
}
void *p=malloc(100);
sizeof(p)=4;
struct ALIGN
{
char a;
int b;
char c;
}A;
sizeof(A)=12;
struct ALIGN
{
int b;
char a;
char c;
}B;
sizeof(B)=8;
#program pack(1)
#program pack()可以禁止对其调整
strlen()函数的参数只能是char *类型的
(10) 对函数使用sizeof,在编译阶段会被函数返回值的类型取代。如 int f1(){return 0;},sizeof(f1)=sizeof(int)=4;
空类所占空间为1,单一继承的空类空间为1,多重继承的空类空间还是1,但是虚继承涉及到虚表一,所以为4;
(11) 内联函数和宏定义的区别
内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接镶嵌到目标代码中。而宏只是一个简单的替换。内联函数要做类型参数检查。
inline fac(float i) {return i*i};//没有写返回值
printf("bb=%d\n",fac(8))://调用的时候执行的是printf("bb=%d",8*8);
(12) 指针和引用的区别
答:非空,指针可以为空,引用不行;引用总是指向初始化时候的对象,指针可以改变。引用总是指向一个对象,并且不会改变。
(13)const 常量定义的时候必须初始化,const常量指针定义的时候也必须有指向对象;