- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
int main()
{
int a = 10;
int *p; // int *p = a; gives me an error: invalid conversion from int to int *.
// Tell me why?
*p = a; // while this runs
cout << &a <<" "<<p;
}
其次 &a 和 p 给出了 2 个不同的值。根据我的说法,a 的地址和指针 p 中存储的值应该相同吗?
最佳答案
int *p = a
,按字面解释,获取存储在 a
中的值,并尝试将其解释为内存地址 存储在p
中。虽然在计算上是合法的,但 C++ 不允许在没有显式类型转换的情况下这样做,因为这通常不是您想做的。
语句int *p = a
与*p = a
不同的原因很简单:第一个语句,下面的简写
int *p;
p = a;
正在初始化指针,因此它需要 RHS 上的内存地址,而第二条语句正在为 p
指向的位置赋值,因此需要(在这种情况下)RHS 上的整数。
如果要初始化p
指向a
,可以使用int * p = &a
或者p = &a
而不是,其中 &
是地址运算符。 永远不要尝试解引用未初始化的指针!您最终会触及基本上任意位置的内存,这可能会导致段错误(导致崩溃)或开始覆盖程序中的其他数据(导致模糊且不可重现的错误)。
当您运行您的示例代码时,p
和 &a
具有不同的值,因为 p
从未被分配为指向 一个
。关于为什么您可能在 p
中得到任何非零值的一些简短背景:局部变量是从称为 堆栈 的特殊内存区域分配的,该区域还存储有关的信息函数调用和返回地址。每个进程都有自己的堆栈。不过,至关重要的是,堆栈的未使用区域在使用前并没有真正归零或以其他方式清理(可能在调试版本中除外,它倾向于分配非常明显的值,如 0xCCCCCCCC
或 0xBAADF00D
到未初始化的指针)。如果您的编译器没有自动为您设置默认值(为了效率起见,发布版本通常不会有这样的自动初始化),您在 p
中看到的就是发生 在您的程序设置其堆栈框架之前位于分配给 p
的内存中。
关于c++ - 变量寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12016783/
我正在尝试提供即时转码的视频。不幸的是,这意味着寻求不起作用。我假设这是因为浏览器不知道视频有多长,因此无法正确显示搜索栏。 有谁知道是否可以对视频的时长进行硬编码? 我想到的另一个选择可能是创建我自
我是一名优秀的程序员,十分优秀!