1.什么是预编译?什么时候需要预编译?
答:预编译又可以叫做预处理,是进行一些代码文本的替代工作;
什么时候需要预编译:
- 不经常需要改动的大型代码;
- 程序有多个模块组成,所有的代码都使用同一组标准的函头文件和相同编译选项
2.char *const p和char const *p 以及const char *p三个区别
char *const p,是指针常量,p的值不可以被改变;
char const *p,指的是指向常量的指针,指向的指针不可以改;
const char *p等同于const char *p;
3.以下程序的输出结果
char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout < < ( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < endl;
答:0 0 1 1,因为str1,str2,str3,str4 是数组变量,它们有各自的内存空间;而 str5,str6,str7,str8 是指针,它们指向相同的常量区域。
4. 以下代码中的sizeof用法有什么问题?
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母 { for( size_t i=0; i <sizeof(str)/sizeof(str[0]); ++i ) if( 'a' <=str[i] && str[i] <='z' ) str[i] -= ('a'-'A' ); } char str[] = "aBcDe"; cout < < "str 字符长度为: " < < sizeof(str)/sizeof(str[0]) < < endl; UpperCase( str ); cout < < str < < endl;
答案:函数内的 sizeof 有问题。根据语法,sizeof 如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的 str 是一个静态定义的数组,因此其大小为 6,因为还有'\0',函数内的 str 实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此 sizeof 作用于上只将其当指针看,一个指针为4 个字节,因此返回 4。
5.一个32位的机器,这个机器的指针是几位?
答:要看指针是几位,就要看地址总线的位数就好了。80386以后的机子都是32的数据总线,所以指针的位数是4个字节!
6.代码输出结果
#include<stdio.h> int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d %d ",*(a+1),*(ptr-1)); return 0; }
答案:2 5
因为我们的*(a+1) 就是a[1],*(ptr-1)就是a[4],所以结果就是2,5. 因为我们&a+1不是首地址+1,系统会认为加一个a数组的偏移,就是偏移另一个数组的大小 int*ptr=(int *)(&a+1);则ptr实际上就是&(a[5]),也就是a+5 原因:因为&a是数组指针,类型是int(*)[5];而指针加上1要根据指针类型加上一定的值,不同的类型指针+1之后增加的大小不同a是长度为5的int数组指针,所以要加上我们的5*sizeof(int),所以ptr实际就是a[5],但是ptr和(&a+1)类型是不一样的(这一点很重要),所以ptr-1只会减去size(int*)。
7.下面代码出错在哪里?
#include<stdio.h> int main() { char a; char *str=&a; strcpy(str,"hello"); printf(str); return 0; }
答:没有给str分配内存空间,将会产生异常,问题出在讲一个字符串复制进到一个字符变量指针所指向的指针。虽然可以正确输出结果,但是越界进行内存读写会导致程序崩溃!
8.下面代码出错在哪里?
#include<stdio.h> int main() { char *s="AAA"; printf("%s",s); s[0]='B' printf("%s",s); return 0; }
答:“AAA”是我们的字符串常量,s是指针,指向这个字符串常量,所以声明s的时候就有问题。const char *s ="AAA";然后又因为是常量,所以对是s[0]的赋值操作是不合法的;
9.写一个标准的宏,这个宏输入两个参数并返回较小的哪一个。
答:#define MIN(X,Y)((X)>(Y)?(Y):(X)) //注意,结尾这里没有“;”
10.嵌入式系统经常要用单无羡循环,你怎么用c编写死循环?
答:使用while(1){}或者for(;;)
11.关键字static的作用是什么?
答:定义静态变量 或者 定义静态函数
12.关键字const有什么含义?
答:定义常量不可以修改的变量
13.关键字volatile有什么含义?并列出三个例子
答:含义:用于提示编码器对象可能在编码器没有监测到情况下改变;
- 并行设备的应缴寄存器(状态寄存器);
- 中断函数中会访问到的非自动变量;
- 多线程应用当中呗几个任务共享的变量;
14.int(*s[10](int)) 表示什么意思?
答:int类型指针数组求整,是一个函数指针数组,每一个指针指向一个int func(int param)的函数;
15.看下列程序回答问题
int a=248,b=4; int const c=21; const int*d=&a; int *const e=&b; int const *f const=&a; //请问下列表达式哪一些会被编码器禁止?为什么?
答:*c=32; d=&b; *d=43; e=34; e=&a; f=0x321f; *c 这是个什么东东,禁止 *d 说了是 const, 禁止 e
= &a 说了是 const 禁止 const *f const =&a; 禁止
16.交换两个变量的值,不适用第三个变量。即a=3,b=5,交换之后a=5,b=3;
答:有两个解法,一个是使用算数运算,另一个就是使用异或,算术运算:a=a+b;b=a-b;a=a-b; 异或:a=a^b;
17.C和C++ 中的struct有什么不同?
答:主要区别是C当中的struct不可以函数成员函数,但是C++中对的可以。C++中的struct和class的主要区别在于默认的存取权限不一样,struct默认为public,但是class默认为private。
18.以下代码会出现什么结果?
#include <stdio.h> #include <stdlib.h> void getmemory(char *p) { p=(char *) malloc(100); strcpy(p,"hello world"); } int main() { char *str=NULL; getmemory(str); printf("%s/n",str); free(str); return 0; }
答:程序会爆炸,因为getmemory中的malloc不可以返回动态内存,free()对str操作很危险。
19.以下代码会出现什么结果?
char szstr[10]; strcpy(szstr,"0123456789");
答:产生的结果是:长度不一样,会造成我们非法的OS
20. 列举几种进程的同步机制,并比较其优缺点
答:原子操作 信号量机制 自旋锁 管程 ,会合 ,分布式系统
21.进程之间的通信途径
答:共享存储系统信息传递系统管道;一文件系统为基础
22.进程死锁的原因
答:资源竞争以及进程推进顺序非法
23.死锁的4个必要条件
互斥、请求保持、不可剥夺、环路
24.死锁处理
鸵鸟策略、预防策略、避免策略、检测与解除死锁
25.操作系统当中进程调度策略有哪几种?
FCTS、优先级、时间片轮转、多级反馈
26.类的静态成员和非静态成员的区别
类的静态成员每个类只有一个,非静态成员每个对象一个
27.纯虚函数该怎么定义?使用的时候要注意什么?
virtual void f()=0;注意接口,之类必须要实现
28.数组和链表区别
答:数组存数据按照顺序存储,固定大小;
链表存数据随机,大小可以动态改变
29.JSO的七层模型是什么? TCP/UDP属于哪一层?TCP/udp有什么优缺点?
答:应用层、表示层、会话层、传输层、网络层、链路层、物理层;
tcp属于传输层;TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单,UDP 头包含很少的字节,比 TCP
负载消耗少。 tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好 udp: 不提供稳定的服务, 包头小,开销小
30.根据代码回答问题
int main() { int x=3; printf("%d",x); return 1; }
问题:函数既然不会被其他函数调用,为什么会返回1?
答:因为在main当中,C语言的标准是认为0代表成功,非0代表错误,具体的值是某中具体出错信息。
31.(void*)ptr和(*(void**))ptr的结果是不是相同?其中ptr为同一个指针
答:两个结果是相同的;
32.已知一个数组table,用一个宏定义,求这个数据的元素个数
答:#define NTBL(table) (sizeof(table)/sizeof(table)[0])