3

关于在 C 中使用指针,我遇到了令人震惊的疑问。因此,我对此进行了很多搜索,但没有得到令人满意的答案。事情是这样的:

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

int x, *pointer;
x = 5;

指针1

好的。在大学里,我学会了这样分配指针:

pointer = &x;

我的内存映射应该是这样的:

指针2

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

*pointer = x;

'x'的内存地址不应该存储在指针的内存地址中吗?我一直在想“Memory Map 2”之类的东西,但结果和“Memory Map 1”一样,即0x106地址包含一个垃圾号。那么如果'x'的内存地址没有存储在指针的内存地址中,程序如何知道我想指向哪里呢?这些信息存储在哪里?

这似乎是一个简单的问题,但我无法理解。:(

提前致谢!:)

4

4 回答 4

7

了解指针的工作方式很棘手。这可能会有所帮助。

你写了

int x, *pointer;

这不仅是惯用的;这告诉你一些重要的事情。它告诉您表达式x一个可以容纳整数的变量;希望这很清楚。它还告诉您,表达式*pointer也是一个可以容纳整数的变量

当你说

x = 123;

这意味着“将值存储123在变量中x”。

所以当你说

*pointer = 456;

这意味着“将值存储456在变量中*pointer”。

当你说

pointer = &x;

这意味着“表达式*pointer——记住是一个可以保存整数的变量——是与“相同的变量x。它们是别名——同一个变量的两个名称。

所以你的问题是:

x如果内存地址未存储在指针的内存地址中,程序如何知道我想指向的位置?

让我用我已经建立的术语重新表述这个问题:

如果我不初始化,程序如何知道哪个变量 指代?*pointerpointer

它不知道。 如果你说:

int x;
printf("%d", x);

然后你可以打印任何整数;这是未定义的行为。您还没有说您希望变量x具有什么值,因此它可以具有任何值。当你说:

int *pointer;
*pointer = 123;

然后你说“存储123在变量中*pointer”,但你没有说变量*pointer是什么。所以,就像x可以有任何值一样,*pointer也可以是任何变量。同样,我们有未定义的行为。

现在清楚了吗?

于 2013-05-11T15:18:46.490 回答
4
int x, *pointer;
*pointer = x;

这是未定义的行为,因为pointer不指向有效的内存位置。

int x, *pointer;
x = 5;
pointer = &x;
*pointer = x;

这最后一行与 基本相同x = x,因为pointer指向x;

于 2013-05-11T15:04:06.250 回答
3

既然*是取消引用运算符,那么您将尝试:

  • 存储的(因为在其名称之前x没有地址,运算符)&

  • 指向的内存 pointer(而不是指针本身,这无论如何都没有意义),这是不确定的,因为您的指针尚未初始化。

这不是存储xinto的地址pointer;你想要的只是通过写作来实现pointer = &x;,没有其他东西可以做到这一点。顺便说一句,由于分配给未初始化指针指向的内存,会*pointer = x调用未定义的行为。

于 2013-05-11T15:02:44.213 回答
2

正在做

*somePtr = someVar

在..somevar指向的位置分配 的值somePtr

为了更全面,

int x = 2, y =3;
int * pointer;
pointer = &x;
*pointer = y;

y分配in的值x。而已!

于 2013-05-11T15:02:48.947 回答