C语言笔试题(嵌入式软件开发) 信托公司笔试题及答案解析
1、一个由C/C++编译的程序占用的内存分为栈区、堆区、全局区、文字常量区、程序代码区存放什么数据?
栈区:一开始编译器就分配好的,函数的局部变量,参数,返回数据。
堆区:由程序员自己进行分配的
全局区(静态区)static):全局变量、静态数据和常量
文字常量:常量字符串
程序代码段:存放函数体的二进制代码
2、static作用?
全局变量:不赋值,默认为零
局部变量:限定作用域,局部函数内使用。
静态函数:只限本模块(C源文件作用域)调用,其他模块(其他C文件)不能调用该静态函数。
3、switch和if区别?
switch类型可以是byte,short,char,都可以隐含转换为int。但是不能是实型(浮点数)
switch是以空间换取时间;if是以时间换取空间。
4、用一个宏表示一年中有多少秒?为什么要用UL?
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
UL:当数值比较大时,乘以另外更大的数值时,int类型可能会越界,用ul强制类型转换可以解决这个顾虑。
5、写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个
#define MIN(x,y) x
int i=60;
int j=50;
i=i+j;
j=i-j;
i=i-j;
printf(“i=%d ”,i);
printf(“j=%d ”,j);
}
方法二:
i=j;j=i;i^=j;
方法三:
// 用加减实现,而且不会溢出
a = a+b-(b=a)
12、一个参数既可以是const还可以是volatile吗?解释为什么。 可以,比如寄存器变量,我们希望它是只读的,但是仍可能是易变的。
13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现? c用宏定义,c++用inline
14、unsigned char *p1; unsigned long *p2;p1=(unsigned char *)0x801000;p2=(unsigned long *)0x810000;请问p1+5= ; p2+5= ; 答案:801005;810014。不要忘记了这个是16进制的数字,p2要加20变为16进制就是14
15、写出输出结果?并解释
#include
void f(unsigned char v)
{
char c = v;
unsigned char uc = v;
unsigned int a = c, b = uc;
int i = c, j = uc;
printf(“---------------- ”);
printf(“%%c: %c, %c ”, c, uc);
printf(“%%X: %X, %X ”, c, uc);
printf(“%%u: %u, %u ”, a, b);
printf(“%%d: %d, %d ”, i, j);
}
int main(int argc, char *argv[])
{
f(0x80);
f(0x7F);
return 0;
}
输出结果:
%c: ?, ?
%X: FFFFFF80, 80
%u: 4294967168, 128
%d: -128, 128
%c: ,
%X: 7F, 7F
%u: 127, 127
%d: 127, 127
由此可见,最高位若为0时,二者没有区别,若为0时,则有区别了。
16、
int a[3]={1,2,3};
总结就是:a是数组首地址,&a是数组首元素的地址.
a+1:就是数组首地址加上一个元素所占的地址大小,这里int是4个字节,所以加上1x4. &a+1:代表的是加上整个数组的大小,这里数组尺寸是3,所以+1代表的是地址加上3x4. *(a+1):代表的是数组第一个元素的!值!不再是元素的地址,这里就是9999. *(&a+1):将&a+1地址取出来. :&a+1地址的前一个元素的地址,这个地址中的元素!值!!取出来!
17、找错误
int main()
{
char a;
char *str=&a;
strcpy(str,“hello”);
printf(str);
return 0;
} 答案:没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。
18、找错误
char* s=“AAA”;是不合法的,s的指针指向字符常量,所以类型是const char*
19、下面这个程序执行后会有什么错误或者效果:
#define MAX 255
int main()
{
unsigned char A[MAX],i;
for (i=0;i
char t:4; 4位
char k:4; 4位
unsigned short i:8; 8位
unsigned long m; // 偏移2字节保证4字节对齐
}; // 共8字节
23、 void main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf(“%d,%d”,(a+1),(ptr-1));
}
输出:2,5
24、
char* s=“AAA”;
printf(“%s”,s);
s[0]=‘B’;
printf(“%s”,s);
有什么错?
"AAA"是字符串常量。s是指针,指向这个字符串常量,所以
版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。