一 :变量/符号定义
1:标识符号的定义描述正确的是:
A:字符和数字开始,可以包含字符、数字和下划线;
B:数字开始,可以包含字符,数字和下划线;
C:字符、数字和下划线开始,可以包含字符、数字和下划线;
D:字符和下划线索开始,可以包含字符、数字和下划线;
答案:C
2:写出运行结果:
{// test1
char str[] = "world"; cout << sizeof(str) << ": ";
char *p = str; cout << sizeof(p) << ": ";
char i = 10; cout << sizeof(i) << ": ";
void *pp = malloc(10); cout << sizeof(p) << endl;
}
6:4:1:4
二:输入输出:
1:格式化输出左对齐使用:
A:-L B:+L C:- D:+
答案:C
2:转化码 “%[^#@]s”将让scanf执行何动作??
答案:
3:printf("%d");,打印结果是什么??
答案:(2367420)
三:优先级别
1:int i=10, j=10, k=3; k*=i+j; k最后的值是?
答案:60
2:i最后等于多少?
int i = 1;
int j = i++;
if((i>j++) && (i++ == j)) i+=j;
答:
i = 5
3:
unsigned short array[]={1,2,3,4,5,6,7};
int i = 3;
*(array + i) = ?
答:
4
四:控制语句
1:对于同样的情况,switch() 和if ... else if ... if那种效
率比较高,他们分别有什么优和缺点??尝试从编译和运行角
度分别进行分析!
答案:
2:下面是C语言中两种if语句判断方式。请问哪种写法更好?为
什么?
int n;
if (n == 10) // 第一种判断方式
if (10 == n) // 第二种判断方式
答案:如果少了个=号,编译时就会报错,减少了出错的可能行,可
以检测出是否少了=
五:指针部分
1:简要叙述NULL,null ,ASCII中NULL以及字符串为空的区别和
相同!
答案:
2:申请内存之后,在内存释放之后,该内存指针应该为什么??
答案:内存释放后为野指针,需要人为的将其设置为NULL;
3:定义int * temp;
以下三个语句分别代表什么意思?
A: *temp ++;
B: ++ *temp;
C: * ++temp;
答案:A 为先加加,后取VALUE!
B 为对相应的VALUE增加了1;
C 为和A一样的情况
该部分主要涉及取内容的优先级和自加的优先级的问
题!
4:一个参数为int 类型,返回结果为int 类型的函数指针如何定
义??
一个函数数组如何定义呢??
假设现在分别有
int test1(int a);
int test2(int a);
int test3(int a);应该如何将其分别赋值给先前的数组?
如何调用呢??
假设我仅仅对
cmp[1] = &test2;
后使用 (*cmp[0])(10);,在编译和运行中分别有什么后
果??
答案:
int (*cmp)(int a);
int ((*cmp[3])(int a));
cmp[1] = test2; 或者 cmp[1] = &test1;
调用 (*cmp[0])(var);
编译过程有警告,运行过程访问非法地址异常退出!
5:用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A
pointer to a pointer to an intege)
d)一个有10个整型数的数组( An array of 10 integers)
e)一个有10个指针的数组,该指针是指向一个整型数的。(An
array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针( A pointer to an array
of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型
数(A pointer to a function that takes an integer as an
argument and returns an integer)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整
型参数并返回一个整型数( An array of ten pointers to
functions that take an integer argument and return an
integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes
an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions
that take an integer argument and return an integer
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,
我同意这种说法。当我写这篇文章时,为了确定语法的正确性,
我的确查了一下书。但是当我被面试的时候,我期望被问到这个
问题(或者相近的问题)。因为在被面试的这段时间里,我确定
我知道这个问题的答案。应试者如果不知道所有的答案(或至少
大部分答案),那么也就没有为这次面试做准备,如果该面试者
没有为这次面试做准备,那么他又能为什么出准备呢?
六:函数部分
1:函数的参数传递有几种方式??分析其优缺点?
七:宏使用
1:简要叙述宏和函数使用的优和缺点??
答案:
2:下题的结果是什么??
#include "stdafx.h"
#define SQR(X) X*X
int main(int argc, char* argv[])
{
int a = 10;
int k = 2;
int m = 1;
a /= SQR(k+m)/SQR(k+m);
printf("%d\n",a);
return 0;
}
这道题目的结果是什么啊?
define 只是定义而已,在编择时只是简单代换X*X而已,并不经
过算术法则的
答:a /= k+m*k+m/k+m*k+m;
3:用预处理指令#define 声明一个常数,用以表明1年中有多少秒
(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
-> #define 语法的基本知识(例如:不能以分号结束,括号的
使用,等等)
-> 懂得预处理器将为你计算常数表达式的值,因此,直接写出
你是如何计算一年中有多少秒而不是计算出实际的值,是更
清晰而没有代价的。
-> 意识到这个表达式将使一个16位机的整型数溢出-因此要用
到长整型符号L,告诉编译器这个常数是的长整型数。
-> 如果你在你的表达式中用到UL(表示无符号长整型),那么
你有了一个好的起点。记住,第一印象很重要。
八:几个关键词的辨析:
1:#include <test.h> 和#include "test.h"有什么区别??
答案:
2:int a = 0;
extern int a;
两个语句分别在编译的过程中执行什么操作??
答案:
九: const 的使用.
1:const 符号常量;
(1)const char *p
(2)char const *p
(3)char * const p
说明上面三种描述的区别;
如果const位于星号的左侧,则const就是用来修饰指针所指
向的变量,即指针指向为常量;
如果const位于星号的右侧,const就是修饰指针本身,即指
针本身是常量。
(1)const char *p
一个指向char类型的const对象指针,p不是常量,我们可
以修改p的值,使其指向不同的char,但是不能改变它指向
非char对象,如:
const char *p;
char c1='a';
char c2='b';
p=&c1;//ok
p=&c2;//ok
*p=c1;//error
(2)char const *p
char const *p;
char c1='a';
char c2='b';
p=&c1;//ok
p=&c2;//ok
*p=c1;//error
(3)char * const p
char c1='a';
char c2='b';
char * const p = &c1;
p=&c1;// error
p=&c2;// error
*p=c1;//ok
此时必须初始化,否则报错!
(4)const char * const p
这种是地址及指向对象都不能修改。
-------------------------------------------------------------
十:static 用法
1:static变量和static 函数各有什么特点?
答:
static变量:在程序运行期内一直有效,如果定义在函数
外,则在编译单元内可见,如果在函数内,在在定义的block
内可见;
static函数:在编译单元内可见;
十一:文件部分
1:当随机访问文件的时候,ftell函数返回???
十二:常见算法:
1:在不用第三方参数的情况下,交换两个参数的值
方法一:
#include <stdio.h>
void main()
{
int i=60;
int j=50;
i=i+j;
j=i-j;
i=i-j;
printf("i=%d\n",i);
printf("j=%d\n",j);
}
方法二:
i^=j;
j^=i;
i^=j;
方法三:
// 用加减实现,而且不会溢出
a = a+b-(b=a)
十三:位域相关
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位
时, 位结构比按位运算符更加方便。
位结构定义的一般形式为:
struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;
其中: 数据类型必须是int(unsigned或signed)。 整型常数必须
是非负的整数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct{
unsigned incon: 8; /*incon 占用低字节的0~7共8位*/
unsigned txcolor: 4; /*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor: 3; /*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1; /*blink 占用高字节的第7位*/
}ch;
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor
注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当
成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具
有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组
和指针, 如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过
两个字节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay : 1;
}workers;
上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每
个位结构成员只有一位, 因此只占一个字节但保存了两个信息, 该字
节中第一位表示工人的状态, 第二位表示工资是否已发放。由此可见
使用位结构可以节省存贮空间。
=============================================================
1:如下的大小为??
struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}
sizeof(A)=?(不考虑边界对齐)
7
十四:SIZEOF相关
1:写出程序结果:
void Func(char str[100])
{
printf("%d\n", sizeof(str));
}
答:
4
分析:
指针长度
2:int id[sizeof(unsigned long)];
这个对吗?为什么??
答:
对
这个 sizeof是编译时运算符,编译时就确定了
可以看成和机器有关的常量。
十四:内存分配
动态内存分配(Dynamic memory allocation) 尽管不像非嵌入
式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配
内存的过程的 。那么嵌入式系统中,动态分配内存可能发生的
问题是什么?这里,我期望应试者能提到内存碎片,碎片收集的
问题,变量的持行时间等等。
让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:
下面的代码片段的输出是什么,为什么?
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
{
puts("Got a null pointer");
}
else
{
puts("Got a valid pointer");
}
这是一个有趣的问题。最近在我的一个同事不经意把0值
传给了函数malloc,得到了一个合法的指针之后,我才想
到这个问题。这就是上面的代码,该代码的输出是“Got a
valid pointer”。我用这个来开始讨论这样的一问题,看
看被面试者是否想到库例程这样做是正确。得到正确的答
案固然重要,但解决问题的方法和你做决定的基本原理更
重要些。
十五:综合部分