C ++字符串指针与它指向的字符串没有相同的内存地址

时间:2013-12-20 05:27:13

标签: c++ string pointers

我编写了一个简单的程序来查看C ++如何处理指向字符串对象的指针(对OOP来说是新手),我很惊讶地看到string* as被分配了string a的内存地址,没有' t存储相当于&a的值。此外,控制台未将值打印到*as。这可能是我的结尾或系统上的错误,还是遗漏了一些基本的东西?

#include    <iostream>
#include    <string>
using std::cout;
using std::cin;
using std::endl;
using std::string;

string a = "asdf";
string* as = &a;
string* as_holder = &a;

int main()
{
    cout << "a = " << a <<  "\t" << "&a = " << &a << " *as = " << *as << endl
        << "as = " << as << endl
        << "++as = " << ++as << endl
        << "*as = " << *as << endl << endl;

    return 0;
}

输出:

a = asdf     &a = 011ff68C *as = 
as = 011FF6A8
++as = 011FF6A8
*as = 

1 个答案:

答案 0 :(得分:4)

在我对程序有效部分(cout的前两行)的测试中,打印输出显示了相同的地址:

a = asdf    &a = 0x8049c90 *as = asdf
as = 0x8049c90

link to a demo

第三行和第四行相当于未定义的行为:一旦执行++as,您将指针移动到“字符串数组”中的下一个std::string(不存在) 。因此,后续解除引用as的尝试是未定义的行为

如果您想获取指向字符串数据的指针,以便通过递增指针移动到下一个字符,您可以使用c_str()成员函数,如下所示:

const char *as = a.c_str();
as++;
cout << as << endl; // This would print "sdf"