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
是一个指向函数的指针。它可以指向不同的函数(如 add
或 subtract
),然后通过 func_ptr
来调用这些函数。
特点:
- 指向函数:函数指针是用来指向函数的指针变量。
- 调用函数:通过函数指针可以间接调用函数。
- 灵活性:函数指针可以动态选择不同的函数进行调用,常用于回调、事件处理等场景。
区别总结
定义 |
返回指针的函数 |
指向函数 |
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新