天天看点

C语言面试题1

1. 写一个“标椎”宏MIN,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A) < (B)?(A):(B)).

2. 嵌入式系统中经常要用到无限循环,你怎样用C编写死循环你呢?

While(1){};

3. 用变量a给出下面定义

  1. 一个整型数。
  2. 一个指向整型数的指针。
  3. 一个指向指针的的指针,它指向的指针是指向一个整型数。
  4. 一个有10个整型数的数组。
  5. 一个有10个指针的数组,该指针指向一个整型数的。
  6. 一个指向有10个整型数数组的指针。
  7. 一个指向函数的指针,该函数有一个整型参数并返回一个整型数。
  8. 一个有10个指针的数组,该指针指向一个函数。
a)int a;         //An integer
b)int *a;        //A pointer to an integer
c)int **a;       //A pointer to a pointer to 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 fuction a that takes an integeratgument and returns an ineteger
h)int (*a[10]) (int);//An array of 10 pointer to fuctions that takean integer argument and return an integer
           

4. 关键字static的作用是什么?

关键字static有三个明显的作用:

1)在函数体内,一个被声明为静态的变量在函数被调用过程中维持其值为上次使用后保存的值。

2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它的函数访问,它是一个本地的全局变量。

3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,那就是,这个函数被限制在声明它的模块的本地范围内使用。

5.关键字const是什么含义。

const int a;
int const a;
const int *a;
int* const a;
int const * a const;
           

前两个作用一样,a是一个常数整型数。第三个意味着a 是一个指向常数整型数的指针在(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常数整型数的常指针(也就是说,指针指向的整型数是不可修改,同时指针也是不可修改的)。

1)关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉用户这个参数的应用目的。如果你曾花很多时间清理其他人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

2)通过各优化器一个附加的信息,使用关键字const也许能产生更紧凑的代码。

3)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

6.嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两端代码,第一个设置a的bit3,第二个清除a的bit3。在以上两个操作中,要保持其它位不变

#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a |= BIt3;
}
void clear_bit3(void)
{
 a &= ~BIt3;
}
           

7.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

int *ptr;
ptr = (int *)0x67a9;
*ptr  = 0xaa55;
           

一个较晦涩的方法是:

8.下面的代码输出是什么,为什么?

void fool(void)
{
	unsigned int a = 6;
	int b = -20;
	(a + b >6)?put("> 6"):puts(" <= 6");
}
           

这个问题测试你是否懂得C语言中的整数自动转换原则,而有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是“>6”。原因是表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此 -20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是非常重要的。

9:#与##的作用?

答:#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。

例如:

#define STR(arg) #arg 则宏STR(hello)展开时为”hello”

#define NAME(y) name_y 则宏NAME(1)展开时仍为name_y

#define NAME(y) name_##y 则宏NAME(1)展开为name_1

#define DECLARE(name, type) typename##_##type##_type,

则宏DECLARE(val, int)展开为int val_int_type

10.请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1.函数原型:int checkCPU()

int checkCPU()
{
	short a = 0x1234;
	char *p = &a;
	if(p[0] == 0x12)
		return 0; //big endian
	else
		return 1;
}
           

11.合法的浮点数有两种表示形式:

十进制小数形式。他有数字和小数点组成,必须有小数点。例如(123.)(123.0)(.123)。

指数形式。如123e3。字母e(或E)之前必须有数字,e后面的指数必须为整数。

规范化的指数形式里面,小数点前面有且只有一位非零的数字。如1.2345e8