100条经典C语言笔试题目(上)

时间:2022-09-05 23:13:38

1. 请填写 bool , float, 指针变量 与“零值”比较的 if 语句。

1.1 请写出 bool flag 与“零值”比较的 if 语句:

if(flag);
if(!flag)

100条经典C语言笔试题目(上)

1.2 请写出 float x 与“零值”比较的 if 语句:

if((x<=0.000001) && (x>=)0.000001);
100条经典C语言笔试题目(上)

1.3 请写出 char *p 与“零值”比较的 if 语句

if(p != NULL)
if(p == NULL)
100条经典C语言笔试题目(上)

2 以下为 Linux下的 32 位 C程序,请计算 sizeof 的值。

	char str[] = "Hello";
char *p = str;
int n = 10;

void Func(char str2[100]);
void *p2 = malloc(100);

请计算:

	sizeof(str) = 6;
sizeof(p) = 4;
sizeof(n) = 4;
sizeof(str) = 4;   //数组已经退出话指针sizeof(p2) = 4;  //32位系统下指针占4字节,64位系统下占8字节
3 计算题

<span style="font-size:14px;">long a = 0x801010;
a + 5 = ?</span>
【标准答案】0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十进制的值为8392720,再加上5就是8392725。
4 写一个函数找出一个整数数组中,第二大的数

5 设有以下说明和定义:

typedef union { long i; int k[5]; char c; } DATE;struct data { int cat; DATE cow; double dog; } too;DATE max;
则语句
printf("%d", sizeof(struct date) + sizeof(max));
的执行结果是多少?


【标准答案】DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20 ,data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32. 所以结果是 20 + 32 = 52.

6 请问以下代码有什么问题:

int main()
{
char a;
char *str = &a;
strcpy(str, "hello");
printf(str);
return 0;
}
【标准答案】没有为str分配内存空间,将会发生异常 。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

7 请问以下代码有什么问题:

char* s = "AAA";
printf("%s", s);
s[0] = 'B';
printf("%s", s);
【标准答案】"AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。 const char *s="AAA"; 然后又因为是常量,所以对是s[0]的赋值操作是不合法的。


8 写出下面的结果

	char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << (str1 == str2) << endl;
cout << (str3 == str4) << endl;
cout << (str5 == str6) << endl;
cout << (str7 == str8) << endl;

(1)str1是一个数组的地址,str2也是一个数组的地址,如果两者地址相等,就代表了同一数组,然而这两个数组是完全独立的,所以str1!=str2;

(2)在老版本的编译器是不一样的,而在一些新版本的编译器上为了优化,可以是一样的;

(3)相等。"abc“在内存里边是一个常量,编译器创建一个指针,该指针指向该常量,可以使得不同的指针指向该常量,因此是相同的。

(4)相等。同(3)。

9 c和c++中的struct有什么不同?
【标准答案】c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。


10 写出输出结果

	int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
【标准答案】 2,5。 &a代表取整个数组的地址,整个数组加1之后再转化为(int *)类型,这里的1其实就是整个数组的长度。


11 以下内容会产生什么结果?

char szstr[10];
strcpy(szstr, "0123456789");
产生什么结果?为什么?
【标准答案】长度不一样,出现段错误。

13 以下程序的输出结果是多少?

char aa[10];	
printf("%d\n", strlen(aa));
printf("%d\n", sizeof(aa));
【标准答案】sizeof()和初不初始化,没有关系,strlen()和初始化有关,打印结果值未知。
14 给定结构
struct  A{ 	char t : 4;		char k : 4;		unsigned short i : 8;		unsigned long m; };
sizeof(A) = ?

【标准答案】8

关于结构体内存对齐问题与位域:

请参考<http://blog.csdn.net/xing_hao/article/details/6678048>

请参考<http://blog.csdn.net/qianqin_2014/article/details/51077223>

15 

struct name1{ 
char str;
short x;
int num;
};

sizeof(name1) = ?

【标准答案】8

16

struct name2{ 
char str;
int num;
short x;
};
sizeof(name2) = ?
【标准答案】12

17 程序哪里有错误

wap(int* p1, int* p2)
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
【标准答案】p为野指针


18 什么是预编译,何时需要预编译

预编译又称为预处理,是做些代码文本的替换工作。处理#开头的 指令,比如拷贝#include 包含的文件代码,#define 宏定义的替换,条件 编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译 指令,预编译指令指示了在程序正式编译前就由编译器进行的操作, 可以放在程序中的任何位置。
c 编译系统在对程序进行通常的编译之前,先进行预处理。c 提供的 预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编 译
更多内容请参考:<http://blog.csdn.net/qianqin_2014/article/details/51137530>

19 (void *)ptr 和 (*(void**))ptr的结果是否相同?其中ptr为同一个指针

【标准答案】(void *)ptr 和 (*(void**))ptr值是相同的

20 

要对绝对地址0x100000赋值,我们可以用 (unsigned int*)0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?

【标准答案】 *((void (*)( ))0x100000 ) ( ); 首先要将0x100000强制转换成函数指针,即: (void (*)())0x100000 然后再调用它: *((void (*)())0x100000)();

21

int a,b,c 请写函数实现c=a+b ,不可以改变数据类型,如将c改为long int,关键是如何处理溢出问题

【标准答案】

bool add(int a, int b, int *c)
{
*c = a + b;
return (a>0 && b>0 && (*c<a || *c<b) || (a<0 && b<0 && (*c>a || *c>b)));
}

22  关于内存的思考题(1)你能看出有什么问题?

100条经典C语言笔试题目(上)100条经典C语言笔试题目(上)

23  关于内存的思考题(2)你能看出有什么问题?

100条经典C语言笔试题目(上)100条经典C语言笔试题目(上)

23  关于内存的思考题(3)你能看出有什么问题?

100条经典C语言笔试题目(上)100条经典C语言笔试题目(上)

23  关于内存的思考题(4)你能看出有什么问题?

100条经典C语言笔试题目(上)100条经典C语言笔试题目(上)

27 main函数既然不会被其它函数调用,为什么要返回 1

参考<http://blog.sina.com.cn/s/blog_6642cd0201016lqo.html>

参考<http://book.51cto.com/art/201202/317558.htm>

28 请写出输出结果

int sum(int a)
{
auto int c = 0;
static int b = 3;
c += 1;
b += 2;
return(a + b + c);
}
int main()
{
int I;
int a = 2;
for (I = 0; I<5; I++)
{
printf("%d,", sum(a));
}
system("pause");

return 0;
}
输出结果:8,10,12,14,16,

29 头文件中的 ifndef/define/endif 干什么用?

【标准答案】防止该头文件被重复引用。

30 #include <filename.h> 和 #include “filename.h” 有什么区别?

【标准答案】对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h ; 对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h 。

31 const 有什么用途?

(1)可以定义 const 常量
(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

32 static有什么用途?(请至少说明两种)

【标准答案】 

1.限制变量的作用域(static全局变量);
2.设置变量的存储域(static局部变量)

33 栈溢出一般是由什么原因导致的?

【标准答案】使用内存超过了栈的大小。

34 如何引用一个已经定义过的全局变量?

【标准答案】可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在链接期间报错。

35 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

【标准答案】可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。 还可以用条件编译。

36 队列和栈有什么区别?

【标准答案】队列先进先出,栈后进先出。


37 完成输出下列字符

/*

*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......

*/

算法:

#include<stdio.h>
#include<stdlib.h>

/*

*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......

*/

static a = 0;

void print2(int n)
{
if (n == 0)
return;
else
{
printf(".");
print2(n - 1);
}
}

void print1(int n)
{
if (n == 0)
return;
else
{
printf("*");
print2(a - 1);
print1(n - 1);
}
}

void run(int n)
{
if (n == 0)
return;
else
{
run(n - 1);
a = n;
print1(n);
printf("\n");

}
}

int main()
{
run(7);
printf("\n");
system("pause");
}
运行结果:

*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......

请按任意键继续. . .
38 用宏定义写出swap(x,y),即交换两数

#define swap(x, y) (x) = (x)+(y); (y) = (x)–(y); (x) = (x)–(y);
#define swap(x, y)	(x) = (x)^(y);\			(y) = (x)^(y);\			(x) = (x)^(y)
39 写一个“标准”宏,这个宏输入两个参数并返回较小的一个

【标准答案】#define Min(X, Y) ((X)>(Y)?(Y):(X))//结尾没有;

40 带参宏与带参函数的区别(至少说出5点)?

【标准答案】
  带参宏 带参函数
处理时间 编译时 运行时
参数类型 需定义
程序长度 边长 不变
占用存储空间
运行时间 不占用运行时间 调用和返回时占










41 请写出数组的冒泡排序法,选择排序法,插入排序法

快速排序算法请参考<http://blog.csdn.net/qianqin_2014/article/details/51207165>

冒泡排序算法请参考<http://blog.csdn.net/qianqin_2014/article/details/51207800>

插入排序算法请参考<>

42 请写出链表的插入排序法,冒泡排序法

43 已知一个数组table,用一个宏定义,求出数据的元素个数

【标准答案】

#define NTBL(table) (sizeof(table)/sizeof(table[0]))
调用方法:

	int arr[10];
printf("%d\n", NTBL(arr));
44 A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?

【标准答案】static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。 他们都放在静态数据区,但是编译器对他们的命名是不同的。 如果要使变量在其他模块也有意义的话,需要使用extern关键字。

45 单链表的建立,把'a'--'z'26 个字母插入到链表中,并且倒叙,还要打印

请参考<http://blog.csdn.net/qianqin_2014/article/details/51025859>

46 求组合数: 求 n 个数(1....n)中 k 个数的组合....

<span style="font-size:14px;">如:combination(5,3)
要求输出:543,542,541,532,531,521,432,431,421,321,</span><span style="font-size:18px;color: rgb(0, 0, 153); font-weight: bold;">
</span>


47 求全排列: 求 n 个数(1....n)中 k 个数的排列....

如:P (2,2)
12 21
如:P (3,2)
12 21 13 31 23 32
48

程序的局部变量存在于___中,全局变量存在于____中,动态申请数据存在于___中。
【标准答案】程序的局部变量存在于 栈(stack)中,全局变量存在于 静态数据区 中,动态申请数据存在于 堆(heap)中。

详情请参考<http://blog.csdn.net/qianqin_2014/article/details/51114105>

49 什么是预编译,何时需要预编译:

【标准答案】

1、总是使用不经常改动的大型代码体。 

2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头

50 用两个栈实现一个队列的功能?要求给出算法和思路!

【参考答案】

设2个栈为A,B, 一开始均为空.   

入队:   

将新元素push入栈A;   

出队:   

(1)判断栈B是否为空;   

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;   

(3)将栈B的栈顶元素pop出;

关于栈的知识请参考<http://blog.csdn.net/qianqin_2014/article/details/51030887>

关于单链队列的知识请参考<http://blog.csdn.net/qianqin_2014/article/details/51037198>

关于循环队列的知识请参考<http://blog.csdn.net/qianqin_2014/article/details/51038089>




出输出结果