指针的真实结构是什么?

时间:2010-11-22 10:10:02

标签: pointers types

正如我到目前为止所了解的那样,指针是内存(堆)中存储内存地址的地方,我真的明白并且可以很容易地处理它,但问题是:如果它只存储一个地址,那么它的大小与计算机内存的大小是对称的,所以所有指针都有相同的大小,那么为什么指针有类型,如果指针X被定义为整数,例如,它有与定义为char的po的大小相同,当我将double的地址或任何类型的diffrenet从整数分配给X时,为什么会出现编译器或运行时错误,而对于Y则相同?指针结构中是否有任何其他组件来确定类型?

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

提前致谢:)

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

4 个答案:

答案 0 :(得分:3)

你是对的,指针只包含一个内存地址,所以给定机器上的所有指针都有完全相同的大小。

此类型和相应的编译器错误可帮助您制作一些一致的代码。但是一旦代码被编译,指针的内存结构中没有任何东西可以告诉它的类型。

答案 1 :(得分:1)

我不知道指针的真实结构(我喜欢这个主题,所以我会看一下我认为你可以在自动机理论和编程语言设计或编写编译器主题中找到它的主题)但是我认为指针有数据类型,所以计算机知道指针指向多少内存,换句话说就是考虑指向一个double的指针,我认为指针指向双倍大小的第一个字的地址采取,但考虑你想在屏幕上输出双,如果指针没有与它指向的值一致的类型,计算机将如何知道它应该在屏幕上打印多少字节!

答案 2 :(得分:0)

初始化时的指针指向它指向的数据的第一个字节。例如,如果int指针指向数据,例如45然后指针可以指向值4或5(取决于机器的最终内容)。以类似的方式,双指针将指向它所指向的数据的内存中的第一个字节。

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

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

这是一般指针解除引用的一般方法。简而言之,指针具有正确取消引用数据的类型。并且所有指针基本上具有相同的大小,即1个字节。希望我足够清楚。

答案 3 :(得分:-1)

我认为指针存储在堆栈上并指向堆上的某个位置?

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

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