1.1
#ifdef NDEBUG
#define TRACE(S) S
#else
#define TRACE(S) printf(”%s;\n”, #S); S
#endif
问:以上TRACE()宏的作用是什么?
1.1 这道题主要考察#的功能,S是一个表达式。TRACE()的作用就是在DEBUG状态下,计算表达式S的值之前先打印S。
1.2 #error的作用?
1.2 #error用于向编译器报错,并输出它后面带的错误信息。例如:
#ifndef SOMETHING
#error SOMETHING not defined!
#endif
如果在这段代码之前未定义过SOMETHING,则在编译时出错,并给出”SOMETHING not defined!”的错误信息。
1.3 定义一个宏,求出给定数组中的元素的个数
#define NELEMENTS(array) ??
1.4 定义一个宏,求出给定结构中给定成员的偏移量
#define OFFSET(structure, member) ??
1.3 #define NELEMENTS(array) (sizeof(array) / sizeof((array)[0]))
1.4 #define OFFSET(structure, member) ((int) &(((structure *)0)->member))
2 (a) An integer:int a;
(b) A pointer to an integer:int *a;
(c) A pointer to a pointer to an integer:int **a;
(d) An array of 10 integers:int a[10];
(e) An array of 10 pointers to integers:int *a[10];
(f) A pointer to an array of 10 integers:int (*a)[10];
(g) A pointer to a function that takes an integer as an argument and returns an integer:int (*a)(int);
(h) An array of 10 pointers to functions that take an integer argument and return an integer:int (*a[10])(int);
3 char (*(*x())[])();
这道题来自”The C Programming Language”中的一个例子。
首先,确定标识符:x
x是一个函数,没有参数:x()
返回值是一个指针:*x()
这个指针指向一个数组:(*x())[]
数组中的每个元素是指针:*(*x())[]
指向一个不带参数的函数:(*(*x())[])()
函数的返回值是char:char (*(*x())[])()
这里,要知道*、()和[]的优先级。
【4 复杂类型(2)】
jmp_buf的定义:
typedef struct _jmp_buf
{
REG_SET reg;
int extra[3];
} jmp_buf[1];
setjmp函数的原型:
extern int setjmp (jmp_buf __env);
问:调用setjmp时传递__env的内容,还是传递指针?
【5 头文件】
问:为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern “C” {
#endif
#ifdef __cplusplus
}
#endif
#endif
【6 static关键字】
请说出static关键字的3种用处:
(1)用于全局变量;
(2)用于局部变量;
(3)用于函数。
static int a;
int b;
static int fn()
{
static int x;
int y;
}
【7 const关键字】
7.1 const关键字的意义是什么?
7.2 解释以下的变量定义:
const int a1;
int const a2;
const int *a3;
int * const a4;
int const * const a5;
【8 volatile关键字】
8.1 volatile意义?例如
volatile int *p;
8.2 volatile能和const一起使用吗?例如
volatile const int *p;
【9 sizeof()】
有以下定义:
char *pmsg = “A”;
char msg[] = “A”;
char ch = ‘A’;
问:
sizeof(pmsg) = ?
sizeof(msg) = ?
sizeof(“A”) = ?
sizeof(ch) = ?
sizeof(‘A’) = ? (在C++中等于多少?)
void f(char param[100])
{
// sizeof(param) = ?
}
【10 字符串】
有以下代码
char *pmsg = “hello, world!”;
strcpy(pmsg, “hi, there.”);
4 这个定义有点怪,它的意思是:jmp_buf这种类型是一个数组,只有一个元素,元素类型为struct{…}。数组名作为函数参数时,应该是传递地址/指针。
5 在编译源文件时,C编译器和C++编译器都会对符号(函数或变量)名作某些修正,但两者采用的修正方法不同,所以两者生成的目标文件不能互相链接。在 C++中使用extern “C”可以让C++符号获得C链接特性。由于C++编译器会自动定义__cplusplus宏,所以在C语言头文件中采用这种结构可以保证无论使用何种编译器,生成的目标文件都具有C链接特性,能够与标准C编译器所生成的目标文件相链接。
6 (1)用于全局变量:外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。
(2)用于局部变量:局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。
(3)用于函数:内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。
7.1 const关键字在C语言中用于声明”常变量”,其值不可修改,但具有确定的数据类型。C编译器总是为其分配相应的存储单元。
在C++中,const关键字用于声明常量,C++编译器视具体情况决定是为其分配存储单元还是仅将其作为编译期间的常量。
7.2 const int a1; a1是整型常量。
int const a2; a2是整型常量。等同于const int a2;
const int *a3; a3是指针(a3是可变的),指向一个整型常量。等同于int const *a3;
int * const a4; a4是常量指针(a4不可变),指向一个整型变量。
int const * const a5; a5是常量指针(a5不可变),指向一个整型常量。等同于const int * const a5;
8.1 volatile关键字用于声明内存映射的易失型变量,这类变量的值随时可能由于某种编译器所不知道的原因(例如,外部设备对其写入)所改变,所以编译器在进行代码优化时不能对其做任何的假设和依赖。
8.2 volatile可以和const一起使用,不过很少见。
const关键字的意思是限制编程者自己不能修改变量的值;两者并不矛盾。
例如一个内存映射的、只读的硬件寄存器,假设它的地址是p,则可以这样声明:volatile const UINT32 *p;
9 sizeof(pmsg) = 指针变量的长度
sizeof(msg) = 2 (字符数组的长度)
sizeof(”A”) = 2 (字符串的长度)
sizeof(ch) = 1 (字符变量的长度)
sizeof(‘A’) = 整型变量的长度 (在C语言中,字符常量的数据类型实际上是int;在C++中,它的数据类型是char,从而原式等于1)
sizeof(param) = 指针变量的长度 (数组名作参数时,传递的是数组的起始地址)
10 这种写法是和编译器&操作系统相关的,所以不应当这样写。在WIN2K+VC环境下debug程序时会出现异常。
不过这样写,编译器不会报错。按道理,”hello…”的类型是const char [N],它是不能赋值给char *的,
因为会丢失常量属性。但在const关键字成为C标准之前,大家都这样写程序,所以char *pmsg = “hello…”
这种写法被给予特别豁免,即使在C++中也是如此,在”The C++ Programming Language”的附录里对此有讨论。
“hello, world!”是字符串常量(string literal),它的类型是const char [N],N为字符串的长度(包括结尾的0)。
“The C Programming Language”指出,写字符串常量的结果是未定义的(undefined)。所以在有些平台(操作系统+编译器)
上程序不会出错,而在其它平台上程序出现异常。
GNU手册里这样说:
Writing into string constants is a very bad idea; “constants” should be constant.
不过在GNU中它提供另外的选择:使用-fwritable-strings进行编译就可以。
那么,为什么不允许修改字符串常量呢(它不也在内存中吗)?
这可能和另外一个特点有关,即重复字符串的合并。现在的编译器应该会主动帮助我们合并程序中相同的字符串常量
以节省内存。如果string literal可写,就会出现问题。例如:
void foo()
{
printf(”%s\n”, “how are you?”);
}
void bar()
{
char *p = “how are you?”;
strcpy(p, “WHO ARE YOU?”);
}
调用foo()当然会打印”how are you”。但如果编译器合并字符串,那么先调用bar(),再调用foo(),foo()打印的就是
“WHO ARE YOU?”。这当然不是我们想要的结果。
另外一方面,这样写也有问题(确实有人这么写):
if (func() == “something”)
…
func()是:
char *func()
{
…
return “something”;
}
这就假设编译器一定会帮我们合并字符串,然而那也不一定。
11 输出”> 6″。
混合运算时的数据类型转换次序:int –> unsigned –> long –> double。
另外,char和short必定转换为int,float必定转换为double。
12 p = (int *)((unsigned int)a + 1);
代码的意图是想使p指向数组的第二个元素,但通常的写法是:p=a+1。这里存在这样的问题:a是个常量地址,
a+1指向下一个数组元素,而((unsigned int)a + 1)指向下一个内存地址。如果地址是字节计数的,则p指向的
是数组第一个元素的第二个字节。还有一个效果就是:在RISC上该printf语句会出异常,因为不允许非对齐访问
(mis-aligned access)。对齐访问就是访问2字节变量的地址要能被2整除,4字节变量的地址要能被4整除,etc。
13 这些函数到处都查得到,就不用做了吧.
分享到:
相关推荐
本压缩包包含了一份“c语言经典笔试题(非常全).pdf”,这份资料集合了大量C语言的经典笔试题目,旨在帮助学习者巩固知识并提升解题能力。 首先,我们要理解C语言的基本结构,包括数据类型(如int、char、float、...
六套华为C语言笔试题 六套华为C语言笔试题
"C语言笔试题整理" 本文档总结了C语言笔试题的知识点,涵盖了预处理指令、宏定义、循环语句、指针、数组、函数指针、关键字static、const、volatile等方面。 1. 预处理指令#define 预处理指令#define可以用来声明...
这些知识点是嵌入式C语言笔试题的常见主题,掌握它们有助于理解C语言的底层机制,编写高效且可靠的嵌入式代码。在面试或笔试中,深入理解这些概念并能灵活运用是至关重要的。通过解决这些问题,开发者可以提升自己的...
【标题解析】:“新华三C语言笔试题(18年两套).rar”这个标题表明这是一份来自新华三公司的C语言笔试题目集,时间是2018年,且包含两套不同的试题。新华三是中国知名的IT企业,尤其在网络、存储和云计算领域有深厚...
本资源“华为C语言笔试题.rar”是华为公司在招聘过程中可能会出现的C语言笔试题目集合,旨在考察应聘者对C语言的掌握深度和问题解决能力。其中包含的“2008830110741.chm”文件很可能是这份试题的详细内容。 C语言...
c语言 面试题 与c语言有关的面试题 华为笔试题 c语言 面试题 与c语言有关的面试题 华为笔试题 c语言 面试题 与c语言有关的面试题 华为笔试题 c语言 面试题 与c语言有关的面试题 华为笔试题 c语言 面试题 与c语言有关...
根据题目要求,我们将从给定的信息中提取并生成与C语言相关的知识点。 ### C语言基础知识 #### 1. 程序执行流程 - **知识点**:C程序的执行流程通常是从`main`函数开始,并在`main`函数内完成所有的逻辑处理后结束...
在C语言中,`sizeof`和`strlen`是两个经常使用的操作符和函数,它们各自有不同的用途和特性。`sizeof`用于获取一个类型或者变量在内存中占据的字节数,而`strlen`则用于计算以空字符'\0'结尾的字符串的实际长度。 1...
有华为,tom等经典笔试题及答案,经过几次笔试,发现各个公司的c语言笔试题都是大同小异,文件中涵盖了不少经典笔试题,希望给即将笔试的同仁有所帮助。
根据给定的文件信息,我们可以总结出以下与华为C语言笔试相关的知识点: ### 一、基础知识及误区澄清 #### 1. 数组初始化与默认值 - **题目示例**:“有数组定义`inta[2][2]={{1},{2,3}};`则`a[0][1]`的值为0。” ...
【标题】2018年9月新华三C语言笔试题 这是一份2018年9月新华三公司针对C语言所出的笔试题目,对于正在寻找IT工作,尤其是对C语言有一定掌握的求职者来说,这是一个极具价值的参考资料。新华三,即紫光股份有限公司...
1. C语言关键字和语法基础 文件中的“extern”、“static”、“for”、“while”、“do”、“if”等都是C语言中的关键字,用于控制程序的执行流程和变量的作用域。 - `extern`用于声明一个全局变量的引用。 - `...
华为C语言笔试题深入解析 一、局部变量能否和全局变量重名? 在C语言中,局部变量可以与全局变量重名,但是当局部变量与全局变量同名时,在局部变量的作用域内,全局变量会被“隐藏”,也就是说,程序会优先访问...
【知识点详解】 1. 链表查找:在给定的描述中,提到了对长度为n的...以上是对2010年3月二级C语言笔试真题中涉及知识点的详细解析。这些知识点涵盖了数据结构、算法效率、软件工程、数据库设计、C语言语法等多个方面。
根据提供的信息,我们可以总结出以下相关的C语言知识点: ### C语言预处理指令 #### `#define`宏定义 - **宏定义的意义与用法:** 宏定义是一种文本替换工具,它可以在编译前将宏定义中的标识符替换为指定的字符...
### C语言笔试题知识点汇总 #### 一、`static` 关键字的用途 1. **限制变量的作用域**:当在函数内部定义一个变量时,若使用 `static` 关键字,则该变量的作用域仅限于定义它的函数内部。这意味着即使在函数外部或...
本文将对腾讯2014校园招聘C语言笔试题进行详细解析和知识点总结。 1. 链表反转输出 在这道题目中,要求输入一个链表的头结点,然后从尾到头反过去输入每个结点的值。链表结点的定义如下: ```c struct ListNode { ...