我在C中使用指针时遇到了令人费解的疑问。所以,我对此进行了大量搜索,但没有给出满意的答案。事情就是这样:
我声明了一个INT类型的指针和一个INT类型的变量(例如int x,* pointer)。所以,我们假设它们都占用RAM中的顺序地址,分别是0x102和0x106。到目前为止没有惊喜。然后,我声明x = 5.我的内存映射应该是这样的,不应该吗?
int x, *pointer;
x = 5;
确定。在大学里,我学会了这样指定一个指针:
pointer = &x;
我的记忆图应该是这样的:
到目前为止一切顺利。但问题是:如果,而不是上面,我分配一个像这样的指针:
*pointer = x;
'x'的内存地址不应存储在指针的内存地址中?我总是想知道像“Memory Map 2”这样的东西,但结果与“Memory Map 1”相同,也就是说,0x106地址包含一个垃圾数字。那么,如果'x'的内存地址没有存储在指针的内存地址,程序怎么知道我想指向哪个?存储此信息的位置?
这看起来像一个简单的问题,但我无法理解。 :(
提前致谢! :)
答案 0 :(得分:7)
获取指针的工作方式很棘手。这可能会有所帮助。
你写了
int x, *pointer;
这不仅仅是惯用的;这告诉你一些重要的事情。它告诉你表达式x
是一个可以包含整数的变量;希望很清楚。它还告诉您表达式*pointer
也是一个可以包含整数的变量。
当你说
时x = 123;
表示“将值123
存储在变量x
”中。
所以当你说
时*pointer = 456;
表示“将值456
存储在变量*pointer
”中。
当你说
时pointer = &x;
这意味着“表达式*pointer
- 记住是一个可以容纳整数的变量 - 与x
”是同一个变量。它们是别名 - 同一个变量的两个名称。
所以你的问题是:
如果
x
的内存地址没有存储在指针的内存地址,程序如何知道我想指向的位置?
让我用我已经建立的术语来重新解释这个问题:
如果我没有初始化
*pointer
,程序如何知道哪个变量pointer
?
它不知道。如果你说:
int x;
printf("%d", x);
然后你可以打印任何整数;这是未定义的行为。您还没有说过您希望变量x
具有什么值,因此它可以具有任何值。当你说:
int *pointer;
*pointer = 123;
然后你说“在变量123
中存储*pointer
”,但你还没有说明变量*pointer
是什么。因此,正如x
可以有任何值,*pointer
可以是任何变量。同样,我们有不确定的行为。
现在清楚了吗?
答案 1 :(得分:4)
int x, *pointer;
*pointer = x;
这是未定义的行为,因为pointer
未指向有效的内存位置。
int x, *pointer;
x = 5;
pointer = &x;
*pointer = x;
最后一行与x = x
基本相同,因为pointer
指向x
;
答案 2 :(得分:3)
由于*
是取消引用运算符,因此您将尝试:
存储x
的值(因为在其名称之前没有地址,&
运算符)
到 pointer
所指向的内存(并且不进入指针本身,无论如何都没有意义),这是不确定,因为你的指针尚未初始化。
这不是将x
的地址存储到pointer
;你想要的只是通过写pointer = &x;
来实现,没有别的办法可以做到。顺便说一句,由于对未初始化指针所指向的内存的赋值,*pointer = x
调用未定义的行为。
答案 3 :(得分:2)
做
*somePtr = someVar
在somevar
..
somePtr
的值
更全面,
int x = 2, y =3;
int * pointer;
pointer = &x;
*pointer = y;
在y
中取消x
的值。就是这样!