Pointers 指针的真实结构是什么?

Pointers 指针的真实结构是什么?,pointers,types,Pointers,Types,到目前为止,我已经了解到,指针是存储内存地址的内存(堆)中的一个位置,我确实理解这一点,并且可以很容易地处理它,但问题是:如果它只存储地址,那么它的大小与计算机内存的大小对称,,因此所有指针的大小都相同,那么为什么指针有类型,例如,如果指针X定义为整数,它的大小与指针Y的大小相同,而指针Y定义为char,为什么在我将地址double(或任何类型的diffrenet)从整数分配到X时,会出现编译器或运行时错误,并且Y也是如此?指针的结构中是否有其他组件决定类型 我只想知道指针的真正结构,它们是如何

到目前为止,我已经了解到,指针是存储内存地址的内存(堆)中的一个位置,我确实理解这一点,并且可以很容易地处理它,但问题是:如果它只存储地址,那么它的大小与计算机内存的大小对称,,因此所有指针的大小都相同,那么为什么指针有类型,例如,如果指针X定义为整数,它的大小与指针Y的大小相同,而指针Y定义为char,为什么在我将地址double(或任何类型的diffrenet)从整数分配到X时,会出现编译器或运行时错误,并且Y也是如此?指针的结构中是否有其他组件决定类型

我只想知道指针的真正结构,它们是如何工作的,以及它们为什么有类型

提前感谢:)


注意:如果我必须指定一种语言,那就是C++

没错,指针只包含一个内存地址,因此给定机器上的所有指针大小完全相同


这里的类型和相应的编译器错误可帮助您生成一些一致的代码。但是一旦代码被编译,指针的内存结构中就没有任何东西可以说明它的类型。

我以为指针存储在堆栈上,它指向堆上的某个位置

指针和变量一样具有“类型”,以提供类型安全性,并允许您在编译时发现问题。但请注意,这只是在编译时(无论如何在C中)


实际上,您可以通过代码设置指向任何内存位置的指针,这就是导致代码中出现许多问题以及病毒利用的漏洞的原因。使用指针在数组中移动是一种常见的技巧,但这确实允许指针移动到数组末尾之外,并访问和修改您不期望的内存部分。

初始化指针时,指针指向它所指向的数据的第一个字节。例如,如果int指针指向数据,例如45,则指针可能指向值4或5(取决于机器的端部无电性)。以类似的方式,双指针将指向它所指向的数据的内存中的第一个字节

这样所有指针的大小都相同

现在,根据指针的类型,可以访问内存中的数据。因此,在16位计算机上,int为16位,当该指针被解引用时,两个字节的数据(包括指针指向的内存中的起始字节和下一个立即字节)从内存中被引用。以类似的方式,当长指针被取消引用时,将引用4个字节


这就是指针解引用在一般情况下的工作原理。简言之,指针具有正确解引用数据的类型。所有指针的大小基本相同,即1字节。希望我足够清楚。

我不知道指针的真正结构(我喜欢这个想法,所以我会看看这个主题,我想你可以在自动机理论和编程语言设计或编写编译器主题中找到一些关于它的东西)但是我认为指针有数据类型,所以计算机知道指针指向多少内存,换言之,考虑指针指向双的指针,我认为指针指向双进位的第一个单词的地址,但是考虑到要在屏幕上输出双份,如果指针的类型与它所指向的值不一致,计算机如何知道它应该在屏幕上打印多少字节

指针只是编译器将其解释为地址的值。它可以存储在堆上、堆栈上,也可以暂时存储在寄存器中。你不需要指针就可以从数组的末尾走出来,你也可以用索引轻松地做到这一点。