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