我有两个变量: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答案,但看不到哪里出了错。
答案 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 是您选择的记忆或价值
希望我帮助了你:)