我编写了一个简单的程序来查看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 =
答案 0 :(得分:4)
在我对程序有效部分(cout
的前两行)的测试中,打印输出显示了相同的地址:
a = asdf &a = 0x8049c90 *as = asdf
as = 0x8049c90
第三行和第四行相当于未定义的行为:一旦执行++as
,您将指针移动到“字符串数组”中的下一个std::string
(不存在) 。因此,后续解除引用as
的尝试是未定义的行为。
如果您想获取指向字符串数据的指针,以便通过递增指针移动到下一个字符,您可以使用c_str()
成员函数,如下所示:
const char *as = a.c_str();
as++;
cout << as << endl; // This would print "sdf"