无法理解C中指针的mem地址结果

时间:2013-05-11 14:58:29

标签: c pointers

我在C中使用指针时遇到了令人费解的疑问。所以,我对此进行了大量搜索,但没有给出满意的答案。事情就是这样:

我声明了一个INT类型的指针和一个INT类型的变量(例如int x,* pointer)。所以,我们假设它们都占用RAM中的顺序地址,分别是0x102和0x106。到目前为止没有惊喜。然后,我声明x = 5.我的内存映射应该是这样的,不应该吗?

int x, *pointer;
x = 5;

pointer1

确定。在大学里,我学会了这样指定一个指针:

pointer = &x;

我的记忆图应该是这样的:

pointer2

到目前为止一切顺利。但问题是:如果,而不是上面,我分配一个像这样的指针:

*pointer = x;

'x'的内存地址不应存储在指针的内存地址中?我总是想知道像“Memory Map 2”这样的东西,但结果与“Memory Map 1”相同,也就是说,0x106地址包含一个垃圾数字。那么,如果'x'的内存地址没有存储在指针的内存地址,程序怎么知道我想指向哪个?存储此信息的位置?

这看起来像一个简单的问题,但我无法理解。 :(

提前致谢! :)

4 个答案:

答案 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的值。就是这样!