C语言经典面试题目详解,c语言经典面试题目总结

本文详细介绍了C/C++编程中的宏定义、预处理指令、关键字作用,如`#define`、`static`、`const`、`extern`、`sizeof`,以及内存操作、链表操作、字符串翻转、排序算法等核心概念。同时,讨论了指针的用法,包括指针数组、函数指针和避免数组与指针混淆的注意事项。此外,还涉及了头文件保护机制及平衡二叉树的概念。
摘要由CSDN通过智能技术生成

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

答:#define MIN(x, y) ((x) 注意 宏定义结尾没有分号。

2.#与##的作用?

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

例如:

#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

3.static关键字的作用?

答:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

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

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

4.const关键字的作用?

答:1声明常变量,使得指定的变量不能被修改。

2修饰函数形参,使得形参在函数内不能被修改,表示输入参数。

3修饰函数返回值,使得函数的返回值不能被修改。

5.extern关键字的作用?

答:1用于修饰变量或函数,表明该变量或函数都是在别的文件中定义的,提示编译器在其他文件中寻找定义。

2 用于extern “c

extern “c”的作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的编译方式进行编译,而不是C++的。

6.sizeof关键字的作用?

答:

sizeof是在编译阶段处理,且不能被编译为机器码。sizeof的结果等于对象或类型所占的内存字节数。sizeof的返回值类型为size_t。

7.结构体变量如何比较?

答:虽然结构体变量之间可以通过=直接赋值,但不同通过比较符如==来比较,因为比较符只作用于基本数据类型。这个时候,只能通过int memcmp(const void *s1, const void *s2, size_t n);来进行内存上的比较。

8.malloc/free与new/delete的区别

答:

malloc与free是C/C++语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。

9…h头文件中的ifndef/define/endif 的作用?

答:防止该头文件被重复引用。

10.什么是平衡二叉树?

答 :左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。

11.冒泡排序算法的时间复杂度是什么?

答 :O(n^2)

12.(void )ptr 和 ((void**))ptr的结果是否相同?

答:其中ptr为同一个指针

.(void )ptr 和 ((void**))ptr值是相同的

13.用指针的方法,将字符串“ABCD1234efgh”前后对调显示

#include

#include

int main()

{

char str[] = "ABCD1234efgh";

int length = strlen(str);

char * p1 = str;//指向数组第一个元素下标;

char * p2 = str + length - 1;//指向数组最后一个元素下标;

while(p1 < p2)

{

char c = *p1;

*p1 = *p2;

*p2 = c;

++p1;

--p2;

}

printf("str now is %s\n",str);

return 0;

}

此题扩展为自己输入,然后逆序输出,大家可以试试;

14.写出程序把一个链表中的节点顺序倒排

typedef struct linknode

{

int data;

struct linknode *next;

}node;

//将一个链表逆置

node *reverse(node *head)

{

node *p,*q,*r;

p=head;

q=p->next;

while(q!=NULL)

{

r=q->next;

q->next=p;

p=q;

q=r;

}

head->next=NULL;

head=p;

return head;

}

15.写出程序删除链表中的所有节点

void del_all(node *head)

{

node *p;

while(head!=NULL)

{

p=head->next;

free(head);

head=p;

}

}

16.交换两个变量(整型)的值,且不允许使用中间值

int a,b;

a^=b;

b^=a;

a^=b;

注:a,b必须为整型变量

17.指针

1.区别int (*p)[5]和int *p[5]。

前者是一个指针,它指向一个含有5个元素的数组。后者是一个数组,它的长度为5,数组中每一个元素指向一个整型变量。

2.区别int *f( int i, int j)和 int (*p)( int i ,int j)

前者是返回指针的函数,它是一个函数的声明,后者是指向函数的指针,它定义了一个指针。

即前者是函数,后者为指针。

注:(1)不能对指向函数的指针做任何运算,如p++、p–、p+n、p-n都是错误的。

3.下面这个程序编译时会报错,请指出错误并改正。

#includeint main(void)

{

int **p;

int arr[100];

p = &arr;

return 0;

}

注:数组名arr的&arr是一个指向长度为100的数组的指针,而p是指向指针(该指针指向的是int型变量)的指针。改成这样就正确了:

#includeint main()

{

int (*p)[100];

int arr[100];

p = &arr;

return 0;

}

尚在学习,后面补齐!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值