2012-02-10 78 views
6

我有一个函数将一个迭代器传递给一个char *缓冲区(它也是一个char *)。该函数需要递增迭代器。无论如何,我发现passsing迭代到函数的好方法是通过引用传递指针:在C++中通过引用传递指针

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

不过,我听说这是不好的形式,并可能导致的问题。这里是方法,我的同事建议我用:

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

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

+4

我宁愿考虑指针类型的类型定义不好的形式会引起问题,但远,编译器有ISN没有什么区别。 – 2012-02-10 16:53:39

+0

为什么不通过修改指针而返回一个增量距离? – Anycorn 2012-02-10 16:54:45

+1

语义上没有区别,但是第二个是主要的,字体很容易阅读。 – 2012-02-10 16:55:02

回答

7

我不认为两者有任何区别。你应该问问你的同事他为什么相信这个问题。

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

+0

差异bw这两个可能是可读性 – Adrian 2012-02-10 17:04:51

+3

@Adrian这是主观的,但。我发现'unsigned char *'比'unsignedintptr'更具可读性,而一些评论则表明不是。你怎么看? – 2012-02-10 17:07:10

+0

不,不是关于可读性。我认为她认为这会导致记忆力问题。 – 2012-02-10 17:09:18

5

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

正如其他人已经正确指出,“不”。

这是正确的吗?

在两种选择之间,它完全归结为“我应该隐藏类型定义背后的指针”辩论。有任何一个位置的有效参数

但是,我认为你的两个代码片段都会受到过分专业化的困扰。我更喜欢将代码算法作为模板函数,所以我Don't Repeat Myself

如果您的设计支持它,你可以概括你的代码接受任何迭代器:

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

那么一个版本比另一个更好呢? – 2012-02-10 17:11:58