2012-02-09 48 views
0

我寧願使用std::string,但我喜歡弄清楚這裏出了什麼問題。std ::查找類型T ** vs T * [N]

即使指針運算對它們正確工作,我也無法理解爲什麼std::find對於T**類型無法正常工作。像 -

std::cout << *(argv+1) << "\t" <<*(argv+2) << std::endl; 

但它工作正常,爲各類T*[N]

#include <iostream> 
#include <algorithm> 

int main(int argc, const char ** argv) 
{ 
    std::cout << *(argv+1) << "\t" <<*(argv+2) << std::endl; 

    const char ** cmdPtr = std::find(argv+1, argv+argc, "Hello") ; 

    const char * testAr[] = { "Hello", "World" }; 
    const char ** testPtr = std::find(testAr, testAr+2, "Hello"); 

    if(cmdPtr == argv+argc) 
     std::cout << "String not found" << std::endl; 

    if(testPtr != testAr+2) 
     std::cout << "String found: " << *testPtr << std::endl; 

    return 0; 
} 

參數傳遞信息:Hello World

輸出:

的Hello World沒有找到
字符串
字符串發現:你好

感謝。

回答

1

比較char const*的類型等於指向地址。除非您將其與字符串文字"Hello"的另一個地址(在這種情況下指針可能比較相等)進行比較,否則"Hello"的地址保證不同。您的compare()函數比較指向的字符。

+0

你能不能現在檢查的第二種情況。 – Mahesh 2012-02-09 02:57:00

+0

沒有任何保證字符串文字得到相同的地址。他們可能會或可能不會。一些編譯器在轉換單元上共享字符串文字是相當徹底的,而另一些則不是。 – 2012-02-09 05:24:53

1

在第一種情況下,您正在比較指針值本身,而不是它們指向的內容。常量「你好」沒有與第一個元素argv相同的地址。

嘗試使用:

const char ** cmdPtr = std::find(argv+1, argv+argc, std::string("Hello")) ; 

std::string知道要比較的內容,而非地址。

對於數組版本,編譯器可以將所有文字合併爲一個文字,因此每次在代碼中看到「Hello」時,它都是相同的指針。因此,在

const char * testAr[] = { "Hello", "World" }; 
const char ** testPtr = std::find(testAr, testAr+2, "Hello"); 

平等比較得出正確的結果

+0

但是它爲什麼對指針類型的字符數組起作用。 – Mahesh 2012-02-09 02:58:37

+1

因爲編譯器可能會將所有相同的文字合併爲一個文字。所以你的代碼中的所有「Hello」文字都是相同的指針 – Pablo 2012-02-09 03:23:06

相關問題