我曾在接受采访时被要求在CPP中给出一个示例或场景,我们无法在没有指针的情况下继续进行,这意味着我们必须使用指针。 我给出了一个函数返回数组的例子,其大小未知,然后我们需要返回指针,该指针是实际上是指针的数组的名称。但是采访者说其内部的阵列给出了一些其他的例子。
所以请帮助我解决其他一些情况。
答案 0 :(得分:2)
如果您正在使用具有返回指针的函数的C库,则必须使用指针,而不是引用。
答案 1 :(得分:2)
还有很多其他情况(例如明确处理内存) - 但首先出现在我的脑海中:
关联的数据结构
如何:您需要在多个位置引用结构的某些部分。您可以使用指针,因为容器(内部也使用指针)不能满足您的所有数据结构需求。例如,
class BinTree {
BinTree *left, *right;
public:
// ...
};
为什么没有其他选择:标准中没有通用的树实现(不包括排序的实现)。
指向实施模式(pimpl)
如何:您的公共.hpp
文件具有方法,但仅通过不透明Whatever *
引用内部状态;并且您的内部实现实际上知道这意味着什么并且可以访问其字段。看到:
Is the pImpl idiom really used in practice?
为什么没有其他选择:如果您以二进制形式提供实现,则标头的用户无法在不进行反编译/逆向工程的情况下访问内部。这是一种更强大的隐私形式。
答案 2 :(得分:2)
您想要使用引用的任何地方,但必须允许null
值
这在库中很常见,如果传递非零指针,它将被设置为值
将函数的参数更改为使用指针,而不是引用强调值可以更改为用户也是一种约定。
答案 3 :(得分:1)
以下是一些案例:
具有较长生命周期的对象。你在函数中创建了一些对象。之后你需要这个对象(甚至不是它的副本)。 但是如果你在没有指针的情况下创建它,在堆栈上 - 在函数完成之后,这个对象就会死掉。因此,您需要使用动态内存创建此对象并返回指向它的指针。
堆叠空间不够。您需要需要大量内存的对象,因此在堆栈上分配它不符合您的需求,因为堆栈通常比堆空间少。因此,您需要使用堆上的动态内存再次创建对象并返回指向它的指针。
您需要引用语义。你有传递给某个函数的结构,你希望函数修改这个结构,在这种情况下你需要传递一个指向这个结构的指针,否则你不能修改原始结构,因为它的副本将是如果你不使用指针,则传递给函数。
注意:在后一种情况下,确实不需要使用指针,因为您可以使用引用替换它。
PS。您可以浏览here以了解更多场景,并确定哪些情况下需要使用指针。
答案 4 :(得分:0)
指针对性能非常重要,这是针对函数的。最初在函数中传递值时,它会复制参数中的值并存储到参数中 但是在指针中你可以间接访问它们并做你想做的事情