我有精神障碍,我知道我应该知道这一点,但我需要一些帮助。
如果我声明一个这样的字符串变量:
string word = "Hello";
如何找到“Hello”的内存地址?
编辑:这就是我想要做的......
编写一个函数,它接受一个参数,一个字符串的地址,并打印该字符串一次。 (注意:您需要使用指针来完成此部分。)
但是,如果提供了第二个参数,类型为int,并且非零,则该函数应该打印字符串的次数等于该点处调用该函数的次数。 (请注意,打印字符串的次数不等于第二个参数的值;它等于到目前为止调用函数的次数。)
答案 0 :(得分:9)
使用:
std::string::data()
如果您的数据不是以空字符结尾的c-string之类的。或
std::string::c_str()
如果您需要数据并保证获得空终止。请注意,其中任何一个调用返回的指针都不必是std::string
对象正在操作的基础数据。
答案 1 :(得分:5)
获取第一个字符的地址是通常的方法。 &word[0]
。但是,如果您不使用遗留代码,则需要执行此操作通常表明您做错了。
答案 2 :(得分:2)
我想你想要一个指向普通旧C字符串的指针?然后使用word.c_str()
。请注意,这不能保证指向字符串的内部存储,它只是您可以使用的(常量)C字符串版本。
答案 3 :(得分:2)
您可以使用c_str()
函数获取指向C字符串的指针(const char *
);但请注意,无论何时修改字符串,指针都会失效;您必须再次调用c_str()
,因为旧字符串可能已被释放。
答案 4 :(得分:0)
声明一个指向变量的指针,然后查看它的结果。
答案 5 :(得分:0)
好的,所以,我知道这个问题已经过时但我觉得这里显而易见的答案实际上是:
std::string your_string{"Hello"};
//Take the address of the beginning
auto start_address = &(*your_string.begin())
//Take the address at the end
auto end_address = &(*your_string.end())
实质上,这将完成与使用相同的事情:
auto start_address = your_string.c_str();
auto end_address = your_string.c_str() + strlen(your_string.c_str());
但是我更喜欢第一种方法(取消引用迭代器的地址),因为:
a)保证使用可能没有c_str方法的开始/结束兼容容器。因此,例如,如果您决定要使用QString(字符串QT使用)或AWS :: String或std :: vector来保存您的字符,那么c_str()方法将不起作用,但上面的方法将会起作用。< / p>
b)可能没有c_str()那么昂贵...一般来说应该与第二行代码中的调用类似地实现,以获取地址但不保证以这种方式实现(例如,如果你使用的字符串不是null终止,它可能需要重新分配和整个字符串的变异,以便添加空终止符...这将突然使其线程不安全且非常昂贵,但事实并非如此std :: string但可能适用于其他类型的字符串)
c)它更好地传达意图,最终你想要的是一个地址,第一堆代码就是这样表达的。
所以我说这种方法更适合:
清晰度,兼容性和效率。
编辑:
请注意,无论使用哪种方法,如果在获取地址后更改初始字符串,地址将失效(因为字符串可能会被重新定位)。编译器不会警告你不要这样做,它可能会导致一些非常讨厌的错误:/