1、1、普天 C+笔试题1实现双向链表删除一个节点 P,在节点 P 后插入一个节点,写出这两个函数。2写一个函数,将其中的 都转换成 4 个空格。3Windows 程序的入口是哪里?写出 Windows 消息机制的流程。4如何定义和实现一个类的成员函数为回调函数?5C+ 里面是不是所有的动作都是 main()引起的?如果不是,请举例。6C+ 里面如何声明 const void f(void)函数为 C 程序中的库函数?7下列哪两个是等同的int b;A const int* a = B const* int a = C const int* const a = D int const* const
2、 a = 8内联函数在编译时是否做参数类型检查?void g(base void main()son s;g(s);return;1设计函数 int atoi(char *s)。 2 int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是多少? 323 解释局部变量、全局变量和静态变量的含义。 4 解释堆和栈的区别。 5 论述含参数的宏与函数的优缺点。2、通用电气 C 语言笔试3、 int (*A10)(int)的含义:表示声明一个指针数组,数组的元素个数是 10,每个数组元素都是指向函数的指针,每个指针指向的函数拥有一个 int 类型形式参数,每个指针
3、指向的函数的返回类型都是 int 类型。从变量 A 开始,根据优先级结合,先与 结合,便是 A 是一个数组,再与* 结合,表示数组元素是指针,再与括号外的()结合,表示每个指针指向的都是函数,函数()内 int 表示形参是 int 类型,最前面的 int 表示函数返回值是 int 类型。追问指针数组 数组指针 的区别? *A10是指针数组,还是数组指针?回答指针数组 A,表示 A 是一个数组,它的每一个元素是指针;数组指针 A,表示 A 是一个指针,它指向的是一个数组;*A10声明的是一个指针数组,因为 的优先级比 *的优先级高,所以 A首先是一个数组,在 A10前面的*表示这个数组的每个元素
4、是指针;而(*A)10声明的是一个指向数组的指针,因为加了括号,所以*A 优先级高,A 首先是一个指针,后面的 表示这个指针指向的是一个数组。int (*func)(int *p);首先找到那个未定义的标识符,就是 func,它的外面有一对圆括号,而且左边是一个*号,这说明 func 是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而 func 是一个指向这类函数的指针,就是一个函数指针,这类函数具有 int*类型的形参,返回值类型是 int。4、可以参考:指针嵌套读法http:/ (*func)(int *p);首先找到那个未定义的标识符,就是 fu
5、nc,它的外面有一对圆括号,而且左边是一个*号,这说明 func 是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而 func 是一个指向这类函数的指针,就是一个函数指针,这类函数具有 int*类型的形参,返回值类型是 int。int (*func)(int *p, int (*f)(int*);func 被一对括号包含,且左边有一个*号,说明 func 是一个指针,跳出括号,右边也有个括号,那么 func 是一个指向函数的指针,这类函数具有 int *和 int (*)(int*)这样的形参,返回值为 int 类型。再来看一看 func 的形参 in
6、t (*f)(int*),类似前面的解释,f 也是一个函数指针,指向的函数具有 int*类型的形参,返回值为 int。int (*func5)(int *p);func 右边是一个运算符,说明 func 是一个具有 5 个元素的数组,func 的左边有一个*,说明 func 的元素是指针,要注意这里的*不是修饰 func 的,而是修饰 func5的,原因是运算符优先级比*高,func 先跟结合,因此*修饰的是 func5。跳出这个括号,看右边,也是一对圆括号,说明 func 数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为 int。int (*(*func)5)(
7、int *p);func 被一个圆括号包含,左边又有一个*,那么 func 是一个指针,跳出括号,右边是一个运算符号,说明 func 是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func 是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有 int*形参,返回值为 int 类型的函数。int (*(*func)(int *p)5;func 是一个函数指针,这类函数具有 int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有 5 个 int 元素的数组。要注
8、意有些复杂指针声明是非法的,例如:int func(void) 5;func 是一个返回值为具有 5 个 int 元素的数组的函数。但 C 语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但 C 语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。int func5(void);func 是一个具有 5 个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同
9、的。作为练习,下面列几个复杂指针声明给读者自己来解析,答案放在第十章里。int (*(*func)56)78;int (*(*(*func)(int *)5)(int *);int (*(*func789)(int*)5;实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用 typedef 来对声明逐层分解,增强可读性,例如对于声明:int (*(*func)(int *p)5;可以这样分解:typedef int (*PARA)5;typedef PARA (*func)(int *);这样就容易看得多了指针用法:http:/ union 中,所
10、有的共用体 成员共用一个空间,并且同一时间只能储存其中一个成员变量的值,当一个共用体被声明时, 编译程序自动地产生一个 变量, 其长度为联合中最大的变量长度的整数倍。union aa float x; char c6; ;占8个字节。union foochar s10;int i; ;占 12 个字节union foo int i; char c;double k; ; 占 8 个字节6、公司笔试 c、c+试题现在的公司招聘, 都要笔试面试.如果你不是那种编程功底非常深厚的人,又不好好准备一番,在笔试面试中往往会处于被动局面.虽然有些笔试题是故意为难我们,有点钻牛角尖.但是很多笔试题面试题确实
11、能够很好地看出我们的基础.在这里,我就略去那些钻牛角尖的题.我近半年的收集中选出 10 道有代表性的题目, 难度基本上是逐渐加大.对数组,指针, 数据结构,算法,字符串, 文件操作等问题都有覆盖.主要以 c 语言的实现为主,也有 c+的题.大家可以先做做这 10 道题, 测试一下自己的水平 .1. 下面这段代码的输出是多少(在 32 位机上).char *p;char *q20;char *m2020;int (*n)10;struct MyStructchar dda;double dda1;int type ;;MyStruct k;printf(“%d %d %d %d %d“,size
12、of(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k);2.(1)char a223=1,6,3,5,4,15,3,5,33,23,12,7 ;for(int i=0;i void main( void ) int a5=1,2,3,4,5;int *ptr=(int *)( printf(“%d,%d“,*(a+1),*(ptr-1);return; 输出结果:2,5 。*(a+1)其实很简单就是指 a1,输出为 2.问题关键就在于第二个点,*(ptr-1)输出为多少?解释如下,其实 ptr 实际是而指针加 1 要根据指针类型加上一定的值,不同类型的指针+1 之后增加的大小不同,a 是长度为 5 的 int 数组指针,所以要加 5*sizeof(int),所以 ptr 实际是 a5,但是 ptr 与(&a+1)类型是不一样的,这点非常重要,所以 ptr-1 只会减去 sizeof(int*),a,&a 的地址是一样的,但意思就不一样了,a 是数组首地址,也就是 a0的地址,&a 是对象(数组)首地址,a+1 是数组下一元素的地址,即 a1,&a+1 是下一个对象的地址,即 a5。7、字符串题目http:/ 字符串格式转换c: 字符串基本运算8、链表题