是否可以使用,例如:
int ref = 776;
int x = *ref;
从特定的内存位置获取值?或者你绝对必须使用:
String text = textView.getText();
Spannable spannable = new SpannableString(text);
String passage = "xy"; // the substring you want to make clickable in the text
int index = text.indexOf(passage); //can return -1 if passage is not in the text (ignored this for the purpose of this example)
spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
//your code here
}
}, index, index + passage.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannable);
答案 0 :(得分:2)
当然,内存地址可以用某些整数文字表示,例如
int* ptr = reinterpret_cast<int*>(776);
并将其解除引用为
int value = *ptr;
是合法的。
是的int value = *reinterpret_cast<int*>(776);
如果您实际可以访问此硬编码内存地址,则完全取决于您的目标环境。
在大多数情况下,操作系统会阻止您访问任意内存地址并使用SEGFAULT
或类似内容退出。
或者你绝对必须使用:
int ref = 776; int x = *ref;
你不能使用那些完全没有意义且无法编译的代码。
你可能意味着什么
int* ref = reinterpret_cast<int*>(776);
int x = *ref;
并如上所述
int x = *reinterpret_cast<int*>(776);
也是合法的。
答案 1 :(得分:2)
简而言之,没有。您不能说int x = *776;
,因为776
是一个整数字面值并被解释为int
而不是int*
。
更长的答案是你(可能)不想这样做(明确解除引用特定内存地址的概念),因为(1)它不可移植,(2)使你的代码非常脆弱,( 3)并没有真正做你想做的事。
access memory on a computer的方法很多,但它们并不相互兼容。最基本的方式称为直接寻址。这是内存中的每个位置都有一个地址的位置,当你说“转到位置0x308”时,它会转到物理内存中的那个单元格。这可能非常危险,因为您可以访问操作系统或BIOS正在使用的内存区域。它还可以防止您(轻松)在您的计算机上运行多个程序。
间接访问存储器的其他方式是相对(偏移)寻址和分段寻址。它们在您使用的地址和物理布局之间有一层保护,可以防止您访问不应该访问的内存。一般来说,这就是你遇到段错误的原因。
如果您编写的代码正在特定位置访问内存,操作系统可能会为您解决所有问题,或者您可能会破坏您的微控制器。
因此,虽然你可以int x = *((int*)776);
,但你可能想要这样做,而且很可能是段错误。