C/C++面试八股题(四)

更多专栏:

超详细的嵌入式面经专栏(适用于小白学习和大佬复习):https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz

校招公司汇总专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybKdp

目录:

1.请问你用过的指针多不?简单说下都用过哪些指针?

2.指针函数和函数指针区别?

3.常量指针 指针常量 常量引用 区别是什么?

4.使用指针需要注意什么?

5.为什么使用智能指针?

6.指针和引用有什么区别?

7.什么是野指针?如何造成的?怎样避免野指针?

内容:

1.请问你用过的指针多不?简单说下都用过哪些指针?

基本指针类型

  • 定义:基本指针类型是指指向基本数据类型(如int、char、float、double等)的指针。这些指针存储的是相应基本数据类型变量的内存地址。
  • 用途:基本指针类型常用于访问和修改基本数据类型变量的值,通过指针可以实现对变量的间接访问。例如,可以在函数间传递变量的地址来修改变量的值。

数组指针

  • 定义:数组指针是一种指向数组的指针。它可以指向整个数组或者数组中的某个元素。数组指针的类型取决于数组的元素类型和数组的大小。
  • 例子:
   int arr[5] = {1, 2, 3, 4, 5};
   int (*ptr)[5] = &arr;  // ptr是一个指向包含5个元素的int数组的指针

  • 这里int (*ptr)[5]是数组指针类型,&arr是取数组arr的地址,将其赋值给ptr
  • 用途:数组指针在处理多维数组时非常有用。

指针数组

  • 定义:指针数组是一个数组,其中的每个元素都是一个指针。这些指针可以指向不同类型的数据,但是在一个指针数组中,通常指针指向的是同一种类型的数据,以便于管理和操作。
  • 例子:
   int num1 = 1, num2 = 2;
   int* ptrArray[2];  // 定义一个包含2个元素的指针数组
   ptrArray[0] = &num1;
   ptrArray[1] = &num2;

  • 这里int* ptrArray[2]是指针数组的定义,它包含两个元素,每个元素都是一个指向int类型变量的指针。
  • 用途:指针数组常用于存储一组同类型的数据地址,比如字符串数组。在 C++ 中,字符串实际上是以'\0'结尾的字符数组,所以可以使用指针数组来存储多个字符串。

函数指针

  • 定义:函数指针是指向函数的指针。函数指针的类型取决于函数的返回值类型和参数列表。函数指针可以用于在运行时动态地选择要调用的函数。
  • 例子:
   int add(int a, int b) {
       return a + b;
   }
   int subtract(int a, int b) {
       return a - b;
   }
   int (*funcPtr)(int, int);  // 定义一个函数指针
   funcPtr = add;  // 将函数指针指向add函数
   int result = funcPtr(3, 2);  // 调用add函数,result的值为5
   funcPtr = subtract;  // 将函数指针指向subtract函数
   result = funcPtr(3, 2);  // 调用subtract函数,result的值为1

  • 这里int (*funcPtr)(int, int)是函数指针的定义,它可以指向返回值为int且有两个int参数的函数。通过将函数指针指向不同的函数,可以实现动态地调用函数。

成员指针

  • 定义:成员指针是指向类的成员(成员变量或成员函数)的指针。成员指针分为指向成员变量的指针和指向成员函数的指针。成员指针的类型取决于类的类型、成员的类型以及成员是否为const等属性。
  • 例子:(指向成员变量的指针):
   class MyClass {
   public:
       int memberVar;
   };
   int main() {
       MyClass obj;
       int MyClass::* ptrToMember = &MyClass::memberVar;
       obj.*ptrToMember = 10;  // 通过成员指针访问和修改成员变量的值
       return 0;
   }

  • 这里int MyClass::* ptrToMember是指向MyClass类成员变量的指针。obj.*ptrToMember是通过对象obj和成员指针来访问成员变量。
  • 例子:(指向成员函数的指针):
   class MyClass {
   public:
       int add(int a, int b) {
           return a + b;
       }
   };
   int main() {
       MyClass obj;
       int (MyClass::* funcPtr)(int, int) = &MyClass::add;
       int result = (obj.*funcPtr)(3, 2);  // 通过成员指针调用成员函数
       return 0;
   }

  • 这里int (MyClass::* funcPtr)(int, int)是指向MyClass类成员函数的指针,通过(obj.*funcPtr)(3, 2)来调用成员函数。

2.指针函数和函数指针区别?

指针函数

指针函数是一个返回指针的函数。换句话说,指针函数的返回类型是指针类型。

语法:

return_type* function_name(parameters);

这里,return_type 是指针类型,表示该函数返回一个指针。

例子:

int* getPointer() {
    int x = 10;
    return &x;  // 返回指向 x 的指针
}

在这个例子中,getPointer 函数返回一个 int* 类型的指针,表示它返回指向整数的指针。

特点:

  • 返回指针:指针函数返回一个指向某种数据类型的指针。
  • 返回地址:指针函数通常返回局部变量或动态分配内存的地址。
  • 返回类型:函数声明中返回类型需要是一个指针类型。

函数指针

函数指针是一个指针变量,它指向一个函数。函数指针可以用来间接调用函数,通常用于回调函数、事件处理、动态链接等场景。

语法:

return_type (*function_pointer_name)(parameter_types);

  • return_type 是函数返回值的类型。
  • parameter_types 是函数的参数类型。

例子:

#include <iostream>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    // 定义函数指针
    int (*func_ptr)(int, int);
    
    // 将函数指针指向 add 函数
    func_ptr = add;
    
    std::cout << "Add: " << func_ptr(5, 3) << std::endl;  // 调用 add 函数
    
    // 改变函数指针指向 subtract 函数
    func_ptr = subtract;
    
    std::cout << "Subtract: " << func_ptr(5, 3) << std::endl;  // 调用 subtract 函数
    
    return 0;
}

在这个例子中,func_ptr 是一个指向函数的指针。它可以指向不同的函数(如 addsubtract),然后通过 func_ptr 来调用这些函数。

特点:

  • 指向函数:函数指针是用来指向函数的指针变量。
  • 调用函数:通过函数指针可以间接调用函数。
  • 灵活性:函数指针可以动态选择不同的函数进行调用,常用于回调、事件处理等场景。

区别总结

定义

返回指针的函数

指向函数

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式/C++八股 文章被收录于专栏

本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新

全部评论
看上去还行
1 回复 分享
发布于 2024-12-13 21:48 陕西
欢迎大家订阅此专栏,订阅点赞收藏送花后,截图si聊我,免费赠送嵌入式学习资料大礼包(含简历模版、c/c++、嵌入式等资料)
1 回复 分享
发布于 2024-12-14 15:58 陕西
麻烦问一下博主什么时候可以更新到嵌入式想抓紧复习
1 回复 分享
发布于 2024-12-22 11:00 陕西
本章第7小节对于野指针的解释是正确的吗,感觉说的是悬空指针,而悬空指针和野指针二者应该是不一样的叭
1 回复 分享
发布于 01-17 09:20 山东

相关推荐

01-19 20:06
已编辑
C++的上限非常高,但是分阶段性逐步学习是没有问题的,一步步的学,慢慢领悟,总有一天会熟练掌握的。C++&nbsp;语言的学习其实就三个阶段就好了:(1)&nbsp;入门阶段这个阶段的学习主要是熟悉&nbsp;C++&nbsp;语言的语法知识。在这个阶段要做到理解对象的思想方法,培养自己的编程思维能力。目标是可以开发一些像贪吃蛇这种简单的控制台小程序。(2)&nbsp;进阶阶段进阶阶段的学习主要是要掌握&nbsp;C++&nbsp;标准模板库(STL)、设计模式、数据结构基础以及&nbsp;UI&nbsp;界面开发、数据库开发等高级技能。在这个阶段是要达到可以开发复杂的程序,达到工作中&nbsp;C++&nbsp;开发程序员的能力。(3)&nbsp;应用阶段这个是实战阶段,要具备一定的综合性应用软件开发能力。这个阶段就是多观摩别人的项目,看人家的写法,模仿项目,学习其中的思想,一点点的积累,一步步形成自己的东西,厚积而薄发,慢慢你就会发现你也可以了。注意!下面都是超极干的干货一、入门阶段入门阶段的学习主要是熟悉&nbsp;C++&nbsp;语言的语法知识。除了基础的变量、常量、关键字、数据类型、运算符、数组、函数、指针、结构体外,还要学习&nbsp;C++&nbsp;的面向对象编程思想、命名空间&nbsp;namespace、引用、函数扩展、类的封装、构造和析构、继承、多态、异常处理等内容。语言部分的学习建议不要拖太久,一定要规划好时间,一鼓作气,不然自己容易泄气!1.视频推荐此时同学们应该是毫无基础或者稍微有点&nbsp;C&nbsp;语言基础的小白。对于小白来说,不建议上来就看书,因为干看看不懂,容易劝退。可以先从视频教程开始,教材为辅。我当初&nbsp;C++&nbsp;视频是在&nbsp;b&nbsp;站看的黑马程序员的&nbsp;C++&nbsp;课程(我不是他们的托儿从&nbsp;0&nbsp;到&nbsp;1&nbsp;教&nbsp;C++,三百多个小节,每个小节时间都不是很长,除了个别几个在二十多分钟,其余的基本上都在几分钟到十几分钟之间。每一个阶段都会有相应的小项目教学,对初学者来说是很友好的。看视频的时候不是看看就过去了,编程毕竟是门一门手艺活,孰能生巧。建议一边看,一边将视频中的示例或者小项目教学自己也实现一下,刚开始不会可以照着敲,比只看不动手强一百倍。此外,我最近发现深蓝学院出品的「C++&nbsp;基础与深度解析」课程也很不错,深入基础,讲解语法细节。从基础语法讲到&nbsp;Modern&nbsp;C++,从面向过程开发到新编程范式,对大家学习&nbsp;C++&nbsp;很有帮助。2.书籍推荐入门阶段的书籍为辅,怎么为辅呢?就是视频看完一个阶段,然后就可以去看书上对应阶段的内容,这样看书,一方面看书的时候会很快,容易理解,另一方面可以印证自己在看视频的时候一些不太理解的地方。入门阶段推荐两本书,一本薄的,一本厚的,都是超级经典的书籍。《Essential&nbsp;C++》《Essential&nbsp;C++》是一本内容不多但很实用的&nbsp;C++&nbsp;入门书籍,这本书强调的是快速上手与理解&nbsp;C++&nbsp;编程。主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到&nbsp;C++&nbsp;的函数和结构,也会学习到它们的设计目的和基本原理。《C++&nbsp;Primer&nbsp;Plus》&amp;amp;《C++&nbsp;Primer》很多人&nbsp;C++&nbsp;入门的时候会推荐《C++&nbsp;Primer&nbsp;Plus》,很多人&nbsp;C++&nbsp;入门的时候会推荐《C++&nbsp;Primer&nbsp;Plus》,我当年先看的也是这本书,当年&nbsp;C&nbsp;语言除了学校的教材,我看的就是《C&nbsp;Primer&nbsp;Plus》。这本书怎么说的,讲的超级全面,甚至有点过于全面了,书中的例子和课后习题循序渐进,不夸张的讲所有的知识点可能都囊括进去了,作者可能为了怕大家学不明白,讲的巨细,甚至我感觉都有点啰嗦,造成这本书巨厚,字又巨小,看完感觉近视又加了几度。当时我学习的时候《C++&nbsp;Primer》还是第&nbsp;4&nbsp;版,现在都到第&nbsp;5&nbsp;版了!《C++&nbsp;Primer》堪称&nbsp;C++&nbsp;语法学习的最权威书籍,非常全面地讲解了C++的语法以及C++11的各种新特性,看完之后真的帮助特别大!如果有时间建议至少看两遍以上!时面向&nbsp;C++&nbsp;语言的初学者,是一本很友好的自学教材!而且例程和习题丰富,相信认真读过之后,可以完成&nbsp;C++&nbsp;语言入门这个目标!!如果你在这个阶段觉得差不多了,可以尝试找一些在线的练习题做下,如果你不知道去哪找,那可以去下面这个初学者练习编程巩固语法的绝佳去处。它有专门的&nbsp;C++&nbsp;入门编程练习题,专门练习语法和大家的编程逻辑,从变量、数据类型这些基础语法,到数组、字符串这种复合类型,再到函数、面向对象,以及在&nbsp;C++&nbsp;中很重要的&nbsp;STL,最后再来点综合练习,差不多&nbsp;70&nbsp;多道题,够你练的。除了编程练习以外,如果你想知道你自己的知识点掌握的如何,也可以做一下专项练习。以类似试卷的形式,可以很好的检验自己的学习成果,不管是对之后应对考试,或者应付笔试面试都很有帮助。二、进阶阶段在进阶阶段,你已经对&nbsp;C++&nbsp;有一定的认知了。这个时候我们可以深入学习&nbsp;C++&nbsp;标准模板库(STL)、设计模式、数据结构基础以及&nbsp;UI&nbsp;界面开发、数据库开发等高级技能。1.书籍推荐《C++标准程序库》关于&nbsp;STL,可以先读这本侯捷老师翻译的《C++&nbsp;标准程序库》。通过这本书对STL有个基本认识,学会使用&nbsp;STL。《STL源码剖析》读完&nbsp;《C++&nbsp;标准程序库》,就可以来读这本侯捷老师编写的《STL源码剖析》了。这本书建议必读!这本书讲解了&nbsp;C++&nbsp;底层实现,主要包括&nbsp;C++&nbsp;底层内存管理、各种容器的数据结构实现、常见算法的实现等。可以帮助深入理解C++底层,同时也是对数据结构的复习和巩固。《Effective&nbsp;C++》《Effective&nbsp;C++》讲了&nbsp;C++&nbsp;编程的&nbsp;55&nbsp;条准则,提高你的&nbsp;C++&nbsp;编程质量,也是侯捷老师翻译的!这本书有助于梳理在编写&nbsp;C++&nbsp;程序时的一些常见错误和注意事项,也是面试常考的。《深度探索C++对象模型》《深度探索C++对象模型》这本书讲解了C++面向对象特性的底层实现机制。侯捷老师翻译的,看完这本书,对C++面向对象的理解帮助极大,建议必读!2.视频推荐不知道大家注意了没,上面我推荐了四本书,都和一个人有关:侯捷老师。书要么是他翻译的,要么是他写的,C++&nbsp;领域&nbsp;YYDS!同意吧?侯捷老师当然也有讲课,针对书都有对应内容的视频课程!三、应用阶段其实编程语言就是要多练,怎么多练,就是代码量。自己多写,然后多观摩别人的项目,看人家的写法,模仿项目,学习其中的思想,一点点的积累,一步步形成自己的东西,厚积而薄发,慢慢你就会发现你也可以了。面经可以参考c++面经&nbsp;总结的很详细&nbsp;&nbsp; https://daxprogram.com/
点赞 评论 收藏
分享
01-17 15:42
门头沟学院 Java
算是一家小型初创公司,ai相关,刚起步岗位需求多,投的后端实习岗,年后入职。面试官说有机会接触到一些算法上的东西,公司核心业务可以说是跟自己研究方向相关的,至少目前非常满意😊虽然难度低,也没深挖什么八股,但这次的面试状态是秋招以来最好的一次了(前一天晚上看了会儿今天不coding的直播,听同龄人分享各种经历,确实很大程度上缓解了内心的焦虑),可能也是由于面试形式是展示代码吧,对着自己的代码框框讲,就显得十分自信,面完几个小时后就发offer了。第一个项目是黑马点评,简单展示了一下用户登录,店铺信息缓存,优惠券秒杀的功能。提问:1.&nbsp;在秒杀时,为什么要用lua脚本。&nbsp;&nbsp;&nbsp;&nbsp;A:保证原子性2.&nbsp;为什么选择caffeine做本地缓存&nbsp;&nbsp;&nbsp;&nbsp;A:技术选型上没有什么考虑,只是知道有这么个技术,就用来练手了。使用caffeine时需要注意缓存一致性问题。3.&nbsp;项目还有没有其他亮点&nbsp;&nbsp;&nbsp;&nbsp;A:封装了redisson的布隆过滤器,结合redis缓存空值去避免缓存击穿。由于布隆过滤器是后期引入的,此时数据库已经有一百万条了(模拟的),通过多线程读取数据库中的数据,写入布隆过滤器,来加快布隆过滤器的构建。并利用自增的主键id解决深分页问题。4.&nbsp;布隆过滤器的原理&nbsp;&nbsp;&nbsp;&nbsp;A:bitmap,多个hash函数5.&nbsp;布隆过滤器的缺点&nbsp;&nbsp;&nbsp;&nbsp;A:误判,不支持删除6.&nbsp;如何解决删除问题&nbsp;&nbsp;&nbsp;&nbsp;A:定期重写布隆过滤器&nbsp;&nbsp;&nbsp;&nbsp;这里面试官说这种方案不好,因为重写过滤器会影响到业务的使用,我提了可以在低峰期重写,但面试官还是不太满意。第二个项目是github上找的一个开源项目,主要关注了一下核心业务的实现,并做了一定的改进与拓展。由于时间原因,简单介绍了一下用rabbitmq异步将用户点赞记录写入数据库的实现。提问:用mq异步写入点赞数据,如果消费者效率慢,会导致前端页面反馈不及时,如何解决A:可以用redis缓存文章点赞数,并定期将mysql中记录的点赞记录数量同步到redis缓存中(当时这里没想好,随便答的。或者应该用redis的set来缓存点赞记录,并定期写入mysql?)反问环节略
查看7道真题和解析
点赞 评论 收藏
分享
评论
23
26
分享

创作者周榜

更多
牛客网
牛客企业服务