在C++中如何通过引用传递指针

6

我有一个函数,其中我传入了一个char *缓冲区的迭代器(也是char *)。该函数需要增加迭代器。无论如何,我发现将指针通过引用传递到函数中是一种不错的方法:

bool myFunction(unsigned char * &iter)
{
   ...

然而,我听说这种做法很不好,可能会引起问题。这是我的同事建议我使用的方法:

typedef unsigned char * unsignedcharptr;
bool myFunction(unsignedcharptr &iter)
{
   ...

在我看来,它们似乎都在做同样的事情。这两种方法之间是否存在编译器差异(我使用的是Visual Studio 2005)?哪个是正确的?


4
我认为给指针类型定义typedef会引起问题,但实际上对于编译器来说并没有什么区别。 - Christian Rau
1
从语义上讲没有区别,但是第二个更受欢迎,因为类型易于阅读。 - Mr.Anubis
1
@Mr.Anubis 嗯,直到你忘记iter是一个指针而不是一个对象。在一个长类型名称中,*ptr更能表达出来。 - Christian Rau
@ChristianRau,我不明白你的意思。 - Mr.Anubis
@ChristianRau 嗯,归根结底,你是否想使用typedefs都是你的选择,但例如在转换运算符中包括指向某种类型或其他更难的构造等情况下,你必须包含typedefs。 - Mr.Anubis
显示剩余3条评论
2个回答

7

我认为这两者没有任何区别。你应该问问你的同事他为什么觉得有区别。

可能的原因是可维护性,如果你想从unsigned char * 切换到 char *,你只需要更改一个地方。但我认为,这可能会导致其他问题。


3
@Adrian,这是主观的。我发现unsigned char*unsignedintptr更易读,而一些评论则持相反意见。你认为呢? - Luchian Grigore
不,这与可读性无关。我认为她认为这会导致内存问题。 - Joe Lyga
@JoeLyga 我不知道你们俩独立思考的结果是什么 xD 但如果你谈论你上面的代码示例,她搞错了。 - Mr.Anubis

5

这两种方法在编译器上有区别吗(我使用的是Visual Studio 2005)?

正如其他人正确指出的那样,“没有区别”。

哪一个是正确的?

在这两个选择之间,完全取决于“我应该在typedef后面隐藏指针”的辩论。每种立场都有其合理的论据。

但是,我认为你们两个代码片段都过于专业化了。我更喜欢将算法编写为模板函数,这样我就可以避免重复

如果你的设计支持,你可以将代码泛化以接受任何迭代器:

template <class InputIterator>
bool myFunction(InputIterator &iter)
{
  std::cout << *iter;
  ++iter;
  return true;
}

1
那么,一个版本怎么比另一个版本更好呢? - Luchian Grigore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接