我在C中使用指针时遇到了令人费解的疑问.所以,我对此进行了很多搜索,但没有给出满意的答案.这是事情:
我声明了一个INT类型的指针和一个INT类型的变量(例如int x,*pointer).所以,我们假设它们都占用RAM中的顺序地址,分别是0x102和0x106.到目前为止没有惊喜.然后,我声明x = 5.我的内存映射应该是这样的,不应该?
int x, *pointer;
x = 5;
Run Code Online (Sandbox Code Playgroud)

好.在大学里,我学会了这样指定一个指针:
pointer = &x;
Run Code Online (Sandbox Code Playgroud)
我的记忆图应该是这样的:

到现在为止还挺好.但问题是:如果,而不是上面,我分配一个像这样的指针:
*pointer = x;
Run Code Online (Sandbox Code Playgroud)
'x'的内存地址不应存储在指针的内存地址中?我总是想知道像"Memory Map 2"这样的东西,但结果与"Memory Map 1"相同,也就是说,0x106地址包含一个垃圾数字.那么,如果'x'的内存地址没有存储在指针的内存地址,程序怎么知道我想指向哪个?存储此信息的位置?
这看起来像一个简单的问题,但我无法理解.:(
提前致谢!:)
获取指针如何工作是棘手的.这可能会有所帮助.
你写了
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可以是任何变量.同样,我们有未定义的行为.
那现在清楚了吗?