2012-02-10 80 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