目录

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,用一个宏定义,求这个数据的元素个数 


1.什么是预编译?什么时候需要预编译?

  答:预编译又可以叫做预处理,是进行一些代码文本的替代工作;

什么时候需要预编译:

  1. 不经常需要改动的大型代码;
  2. 程序有多个模块组成,所有的代码都使用同一组标准的函头文件和相同编译选项

2.char *const p和char const *p 以及const char *p三个区别

 

char *const p 是一个指针常量,这意味着指针p的值(即它指向的地址)是不可以被改变的,但你可以通过这个指针来修改它所指向的数据。

char const *p 和 const char *p 都是指向常量的指针,这意味着你不能通过这个指针来修改它所指向的数据,但指针p本身(即它指向的地址)是可以改变的。
 

const char *p: 这与char const *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有什么含义?并列出三个例子 

答:含义:用于提示编码器对象可能在编码器没有监测到情况下改变;

  1. 并行设备的应缴寄存器(状态寄存器);
  2. 中断函数中会访问到的非自动变量;
  3. 多线程应用当中呗几个任务共享的变量; 

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])

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐