2012-02-09 75 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