一、简答题
1.简述#ifdef、#else、#endif和#iFndef 的作用
#ifdef、#else、#endif 和 #ifndef
是 C/C++ 中的预处理指令,用于条件编译。它们的作用是根据条件来控制代码的编译过程。
#ifdef
(即 “if defined”)指令用于检查一个宏是否已定义。如果该宏已被定义,则编译下面的代码块;否则,跳过该代码块。
#else
指令在与#ifdef
配对使用时,表示如果前面的宏未定义,则编译下面的代码块。
#endif
指令用于结束#ifdef
或#ifndef
块。
#ifndef
(即 “if not defined”)指令与#ifdef
相反,用于检查一个宏是否未定义。如果该宏未定义,则编译下面的代码块;否则,跳过该代码块。
2.sizeof和strlen的区别
1.sizeof 是运算符,而strlen 是C语言库函数中的一个函数;
2.sizeof 操作符用于计算变量或类型的大小,一般单位为字节,通常用于计算内存大小;
3.strlen是计算字符串长度的,遇到\0结束,返回不包括\0,即如果没有\0则会计算出随机值;
3.C语言的malloc和C十+中的new有什么区别
malloc
是 C 语言中的函数,只负责分配内存,不会调用构造函数或初始化对象,分配失败时返回NULL
,释放时用free
。new
是 C++ 中的运算符,除了分配内存,还会调用构造函数进行对象初始化,分配失败时抛出异常(或返回nullptr
),释放时用delete
,更符合 C++ 的面向对象特性。
4.一个参数可以即是const 又是volatile吗?
可以,const 修饰参数,表示该参数在程序内部是只读的,volatile 修饰参数,表示该参数可能会在程序运行期间被外部设备等因素改变。const 和 volatile 同时修饰,则意味着该参数在程序执行过程中不能从内部改变,但可以受到外界条件的影响而改变,所以每次使用这个变量时,程序都是从内存中去读取该值,而不是从寄存器读取它的备份。
注意一点, const关键字在编译期发挥作用,它并没有实际禁止某段内存的读写。
所以,只要同时需要两者的特性,就可以使用 const 和 volatile 关键字修饰同一个参数。
5.说一说c++中四种cast转换
1. static_cast
用于基本数据类型之间的转换,如int转换为double,也可以用于类层次结构中的向上转换(子类转换为父类),但不能用于向下转换(父类转换为子类)。2. dynamic_cast
用于类层次结构中的向下转换(父类转换为子类),但只能用于含有虚函数的类,且转换时会进行类型检查,如果转换失败则返回空指针。3. reinterpret_cast
用于将一个指针转换为另一个类型的指针,或将一个整数转换为指针类型,但不进行类型检查,慎用。4. const_cast
用于去除指针或引用类型的const属性,使其可以修改被指向的对象,但不能用于去除非const类型的const属性。
6.C++类内可以定义引用数据成员吗?
在C++中,类内是可以定义引用数据成员的,但是在初始化对象时,必须在构造函数的成员初始化列表中对引用进行初始化,因为引用必须在创建时被初始化,并且不能在其生存期内引用不同的对象
7.什么是右值引用,跟左值又有什么区别
值引用是C++11的新特性,用于实现转移语义和精确传递,旨在消除不必要的对象拷贝,提升效率,并简化泛型函数定义。左值是指能取地址或具名的对象,右值则是临时、不可寻址的对象。左值可寻址、可赋值且可变,而右值则不可寻址,只能用于给左值赋值,且右值引用通常不可变。
8.链表和数组有什么区别
1、存储方式不同
数组是连续存储,数组在创建时需要一个整块的空间。链表是链式存储,链表在内存空间中不一定是连续的。
数组一般创建在栈区,链表一般创建在堆区,在增加节点时需要new或malloc新节点,相较于数组长度不固定,自由度高。
2、访问元素方式不同
数组可以通过下标随机访问,单向链表只能通过头结点从前向后访问链表中的元素。3、增删效率不同
数组在插入或删除的时候需要移动链表中的其他元素,时间复杂的为O(n)。链表在进行插入删除时,找到要插入或删除的位置后,增删时间复杂度为O(1)。
所以当线性表进行大量的插入和删除操作时建议使用链表,若主要对线性表进行查找操作,较少进行插入操作是建议使用数组。
9.简述队列和栈的异同
栈与队列的相同点:
1.都是线性结构。
2.插入操作都是限定在表尾进行。
3.都可以通过顺序结构和链式结构实现。、
4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。
5.多链栈和多链队列的管理模式可以相同。
栈与队列的不同点:
1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。
2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。
3.顺序栈能够实现多栈空间共享,而顺序队列不能。
二、编程题
1.写一个宏MIN,返回两个数小的那个
#define MIN(x,y) ((x) > (y) ? (y) : (x))
2.写出int、bool、 float,指针变量与“零值” 比较的if语句
// 与bool类型比较
if(!val)
//与int 型比较
if(var==0)
//与指针变量比较
if(var == NULL)
//与float型比较
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
3.设置地址为0x13579的整型变量的值为0x97351
int *ptr;
ptr = (int *)0x13579;
*ptr = 0x97351;
4.编码实现字符串转化为数字
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "12345";
int num = atoi(str);
printf("转换后的数字是: %d\n", num);
return 0;
}
标签:链表,const,19,笔试,2024,int,用于,ifdef,转换
From: https://blog.csdn.net/qq_60098634/article/details/141310745