你可以取消引用整数文字吗?

时间:2016-04-12 21:38:18

标签: c++ pointers

是否可以使用,例如:

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);

2 个答案:

答案 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);,但你可能想要这样做,而且很可能是段错误。