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。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新

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

相关推荐

不愿透露姓名的神秘牛友
07-09 12:02
ssob上原来真有BOSS啊
硫蛋蛋:这种也是打工的,只不是是给写字楼房东打工
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 14:08
点赞 评论 收藏
分享
牛客38347925...:9,2学生暑期实习失利开始投小厂,给这群人整自信了
点赞 评论 收藏
分享
评论
23
26
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务