取消引用和引用类示例

时间:2019-06-08 02:45:59

标签: c++ c

我有两个变量:x和x_ptr

假设我最初有以下内容:

Addr    Data    Variable

0x300    7      x
0x104           x_ptr

以下内容将产生什么:*x_ptr = &x;

据我了解,引用运算符&给出了该运算符后面的变量的地址;取消引用运算符*给出该运算符后面变量中存储的内存位置的值。

因此,&x应该给出0x300,而*x_ptr应该给出存储在存储器位置0x300上的值int 7

因此,我希望*x_ptr = &x;将x的内存地址存储到x_ptr中存储的内存位置。

但是因为x_ptr最初没有存储任何值,所以应该产生错误,不是吗?

但是我的课堂笔记说这是预期的结果:

Addr    Data    Variable

0x300    7      x
0x104    0x300  x_ptr

我不明白为什么会这样。 如果我们希望x_ptr存储x的内存地址,我们不应该这样写:

x_ptr = &x代替?

我已经查看了多个stackexchange答案,但看不到哪里出了错。

3 个答案:

答案 0 :(得分:2)

假设x的类型为int,而x_ptr的类型为int*,则表达式*x_ptr = &x无效。 *x_ptr的类型为int,而&x的类型为int。这些类型不匹配,因此分配无效。

表达式x_ptr = &x有效。它将x_ptr的值设置为x的地址。

答案 1 :(得分:2)

你是对的。

*x_ptr = &x仅在x_ptr的类型为int **时有效。这将使*x_ptr的类型成为int *

鉴于这些类型,*x_ptr = &x会将x的地址写入存储在x_ptr中的地址中。

如果内存为:

Addr    Data    Variable

0x300    7      x
0x104    0x011  x_ptr

然后将*x_ptr = &x 0x300放入存储位置0x011。如果x_ptr尚未初始化,则存储器0x104不会为空,但会成为垃圾,并且分配将导致未定义的行为,并且很可能使代码崩溃。

答案 2 :(得分:0)

起初 indexes = pointers 就像其他任何变量

int * x_ptr,x = 7; //,但它们仍然像float和int一样有所不同

x = 7; //表示&x = 7,名称x直接指向等于7的变量 {像x(7)}

x_ptr-> x = 7 指针->不精确地指向变量x,其值等于7 {x_ptr-> {x} 7}

“不精确地”称为间接

*&像钥匙和锁一样

结论:* xptr 指向 x 是您选择的记忆或价值


希望我帮助了你:)

相关问题