第一个字符串元素的地址产生意外结果

时间:2017-11-24 10:08:05

标签: c++ arrays string pointers memory-address

目标是编写一个函数,输出一个字符串的第一个元素的地址,该字符串等于一个字符,但是我对结果感到困惑。

当使用首先包含所述字符的字符串评估函数时,我得到字符串开头的地址和第一个元素的地址之间的2个字节的差异。例如。 0x7ffe559716d00x7ffe559716e0。 难道地址不一样吗?

#include <iostream>
#include <string>
using namespace std;

const char* first_char(const char* str, const char ch)
{
    for (int i = 0; str[i] != 0; ++i)
    {
        if (str[i] == ch)
            return (i+str);
    }
    return 0;
}

int main() {
    string str1 = "jasdfgjhk";
    const char ch1 = 'j';
    cout << &str1 << endl;
    //should be the same address as above?
    cout << (void*)first_char(&str1[0], ch1) << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:2)

改变这个:

cout << &str1 << endl;

到此:

cout << (void*)str1.data() << endl;

,您将获得与您的函数返回的地址相同的地址。

原因是std::string不仅仅是一个字符数组,它是一个类,它有一个数组成员,它是一个数组并存储字符串的字符。

通过使用data(),您将获得该数组。当您打印其地址时,它会为您提供数组的实际地址,以及之前的类

答案 1 :(得分:0)

请注意

&str

是&#39;字符串&#39;的起始地址宾语。字符串对象不是字符串本身。它包含一个(隐藏的)动态指针,指向字符串本身。因此,通过上述内容,您可以得到一些&#34;比如指向字符串的指针。

但是:

&str1[0]

你真的得到一个指向字符串中第一个字符的指针。