我不知道如何从C ++中的地址获取字符串。
假装这是地址:0x00020348 假装这个地址具有价值"美味"
我如何获得字符串"美味"从地址0x00020348? 谢谢。
答案 0 :(得分:1)
这个答案是为了在评论中帮助扩展我们的对话。
请参阅以下代码作为示例:
#include <stdio.h>
#include <string.h>
#include <string>
int main()
{
// Part 1 - Place some C-string in memory.
const char* const pszSomeString = "delicious";
printf("SomeString = '%s' [%08p]\n", pszSomeString, pszSomeString);
// Part 2 - Suppose we need this in an int representation...
const int iIntVersionOfAddress = reinterpret_cast<int>(pszSomeString);
printf("IntVersionOfAddress = %d [%08X]\n", iIntVersionOfAddress, static_cast<unsigned int>(iIntVersionOfAddress));
// Part 3 - Now bring it back as a C-string.
const char* const pszSomeStringAgain = reinterpret_cast<const char* const>(iIntVersionOfAddress);
printf("SomeString again = '%s' [%08p]\n", pszSomeStringAgain, pszSomeStringAgain);
// Part 4 - Represent the string as an std::string.
const std::string strSomeString(pszSomeStringAgain, strlen(pszSomeStringAgain));
printf("SomeString as an std::string = '%s' [%08p]\n", strSomeString.c_str(), strSomeString.c_str());
return 0;
}
第1部分 - 变量pszSomeString
应代表您尝试搜索的内存中的实际字符串(为了您的示例,为0x00020348
,但是为int
)。< / p>
第2部分 - 您提到您将指针值存储为iIntVersionOfAddress
,因此const char* const
是指针的整数表示。
第3部分 - 然后我们取整数“指针”并将其恢复为std::string
,以便可以将其视为C字符串。
第4部分 - 最后我们使用C字符串指针和字符串的长度构造'\0'
。你实际上不需要这里的字符串长度,因为C字符串是空字符(std::string
) - 已终止,但是我在你的情况下说明SomeString = 'delicious' [0114C144]
IntVersionOfAddress = 18137412 [0114C144]
SomeString again = 'delicious' [0114C144]
SomeString as an std::string = 'delicious' [0073FC64]
构造函数的这种形式我必须自己逻辑地计算出长度。
输出如下:
std::string
指针地址会有所不同,但前三个十六进制指针值与预期的相同。为void*
版本构造的新字符串缓冲区是一个完全不同的地址,也是预期的。
最后注意事项 - 对您的代码一无所知,int
通常被认为是通用指针的更好表示而不是 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
int pos = ((LinearLayoutManager)(recyclerView.getLayoutManager())).findFirstVisibleItemPosition();
btnAction(pos,5);
}
});
private void btnAction(int position, int bannerListSize) {
for (int i = 0; i < bannerListSize; i++) {
ImageView imageView = (ImageView) linlay_pager.getChildAt(i);
if (i == position) {
imageView.setImageDrawable(mVectorPagerFillCircle);
} else {
imageView.setImageDrawable(mVectorPagerCircle);
}
}
}
。