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

use*_*016 3 c pointers

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

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

int x, *pointer;
x = 5;
Run Code Online (Sandbox Code Playgroud)

指针1

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

pointer = &x;
Run Code Online (Sandbox Code Playgroud)

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

指针1

到现在为止还挺好.但问题是:如果,而不是上面,我分配一个像这样的指针:

*pointer = x;
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢!:)

Eri*_*ert 7

获取指针如何工作是棘手的.这可能会有所帮助.

你写了

int x, *pointer;
Run Code Online (Sandbox Code Playgroud)

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

当你说

x = 123;
Run Code Online (Sandbox Code Playgroud)

这意味着"将值存储123在变量中x".

所以当你说的时候

*pointer = 456;
Run Code Online (Sandbox Code Playgroud)

这意味着"将值存储456在变量中*pointer".

当你说

pointer = &x;
Run Code Online (Sandbox Code Playgroud)

这意味着"表达式*pointer- 记住的是一个可以容纳整数的变量 - 与x" 相同的变量".它们是别名 - 同一个变量的两个名称.

所以你的问题是:

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

让我用我建立的术语来重新解释这个问题:

如果我没有初始化,程序如何知道哪个变量 *pointer引用pointer

它不知道. 如果你说:

int x;
printf("%d", x);
Run Code Online (Sandbox Code Playgroud)

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

int *pointer;
*pointer = 123;
Run Code Online (Sandbox Code Playgroud)

然后你说"存储123在变量中*pointer",但你还没有说出变量*pointer是什么.因此,就像x任何值一样,*pointer可以是任何变量.同样,我们有未定义的行为.

那现在清楚了吗?