c - 指针具体指向哪里?

标签 c pointers memory

指针指向哪里,比如C语言? (我认为在所有可以寻址的语言中都是一样的)我的意思是确切地说是哪种类型的内存。 (RAM、寄存器等)

现在哪些内存可以指向?

最佳答案

所有主内存 (RAM) 都可以看作是一个字节数组。

一个指针可以被认为只是这个数组的一个索引。

在具有内存虚拟化的现代系统上,并非所有内存都可以访问,因此如果您将指针指向任何随机位置并尝试从该位置读取或写入,您一定会遇到非法内存访问异常。但是,只要您让指针指向程序的变量,就没有问题。

此外,存在可读不可写的内存,要么是操作系统设置的权限,要么是ROM映射到RAM的地址空间。因此,仅仅因为您可以从指针指向的内存位置读取值,并不意味着您可以写入它。

不,指针不能指向 CPU 寄存器。 CPU 寄存器完全在称为 RAM 的大字节数组之外。 (但是,存在将硬件的某些特殊 I/O 寄存器映射到 RAM 位置的体系结构,因此实际上可以通过指针访问这些寄存器。因此,这取决于我们谈论的是哪种寄存器。)

很多关于指针的混淆是因为当我们打印它们的值时,我们看到难以理解的值,如 0x51a4851c,但我们从不为它们分配文字值,如 char* p = 0x51a4851c;.

那是因为我们的程序(以及我们的程序使用的数据)位于看似随机的内存位置,例如 0x51a48000,几十年来,除了最小的嵌入式系统外,所有的趋势都是不必确切地知道(永远不必担心)您的程序已加载到哪个地址,因为这些信息太多而且没有实际用途。

因此,当您说 char* p = &c; 时,编译器将生成代码,无需您将 c 的地址加载到 p必须准确知道 c 的位置。

事实上操作系统可以自由地将你的程序加载到它认为合适的任何地址,所以这个地址可能会在你的程序运行之间改变,所以你不必知道任何固定地址是一件非常好的事情,因为真的没有。 (除了最小的嵌入式系统。)

关于c - 指针具体指向哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44225817/

相关文章:

c - 使用指针的指针来引用矩阵

c++ - 实现数据结构时使用智能指针还是原始指针?

c++ - 在 C 中使用 octave 内置函数

c - ASturct arr[] 和 ASturct * arr[] 之间的区别

arrays - char 之前的预期表达式

java - Spark 打印数据帧而不会耗尽内存

java - 如何减少spring boot的内存使用?

c - 如何将 slice 发送到 Go 中的函数?

c# - 将指针转换为 float

java - 如果每个线程都必须访问相同的数组,则会影响性能