【问题标题】:Does pointer only store memory address?指针是否只存储内存地址?
【发布时间】:2014-10-03 11:29:26
【问题描述】:

这些天我正在学习 C 编程语言。我有一个关于指针的问题。

教科书上说指针存储内存地址,使用printf("%p",pointer)我们可以显示这个指针在我们的内存中指向的位置。

但每个指针也有一个类型,如int *pointer、long *p 等等。 int *pointer 表示“p 是指向 int 的指针”。

如果我们写我的问题

int *p,i;
p=&i;
*p=99;

如果指针只包含地址信息,程序怎么知道应该使用多少位来存储整数 99?因为整数可以是 16 位 int 或 32 位 long。

所以我想知道内存中的int指针是否不仅存储地址信息,还存储类型信息?

【问题讨论】:

    标签: c


    【解决方案1】:

    因为整数可以是 16 位 int 或 32 位 long。

    整数 可以,但int 不能。不管它在您的环境中到底有多大,它的大小都是一成不变的(在那个环境中),并且在运行时不会改变。 int * 仅指向 int,而不指向 long。请注意,如果有任何此类问题,它们将同样影响int x;。

    所以指针实际上只存储内存地址。 pointee 的大小信息在类型中(就像非指针变量的类型告诉编译器该变量有多大)。

    【讨论】:

      【解决方案2】:

      确保不要将硬件的功能与编译器的功能混淆。就硬件而言,指针是指向内存位置的地址。该内存位置包含什么以及该数据有多长并不重要。指针也不存储任何东西。它指向一个位置,仅此而已。在汇编中,这类似于使用指向内存位置的寄存器。

      编译器负责跟踪指向位置所包含的数据类型。编译器的工作就是让你免于犯类型错误。这就是有些人抱怨你可以用 C 打自己的脚的地方。可以让指针指向一个数据位置,该位置的数据几乎可以是任何长度。

      【讨论】:

      • 它指向一个位置,仅此而已。似乎并不总是:stackoverflow.com/a/15423304/1949418
      • @jinawee 是的...**总是**。仔细阅读您的链接。提到的每个示例都直接或间接地与某种内存地址有关。
      • 如果我理解正确的话,他们也可以存储权限,所以它不会只存储地址。
      • @jinawee 不。指针不存储任何东西。它们是内存位置的地址。而已。一点也不差。它们指向记忆。这就是为什么它们被称为“指针”。
      【解决方案3】:

      所以我想知道内存中的int指针是否不仅存储地址信息,还存储类型信息?

      不,指针是一个内存地址(或者在某些情况下,一个类似于内存地址的值)。指针不包含数据——它指向数据。在您的示例中,数据存储在另一个位置(给定名称i),而p 包含i 的地址。

      程序如何知道应该使用多少位来存储整数 99?

      所有值类型的位(二进制数字)用于存储存储的值。任何给定的类型(如int)都有固定的大小。 int 可以有不同的大小,具体取决于所使用的系统,但大小始终在编译代码时确定。也就是说,int 类型可以是 16 位、32 位、64 位或其他大小,但编译器将始终使用单一大小来编译整个程序。

      【讨论】:

        【解决方案4】:

        类型信息保留在源代码代码中,并被编译器用于执行类型检查和生成适当的代码,类型隐含在生成的代码中,而不是显式存储为数据.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-22
          • 2021-07-18
          相关资源
          最近更新 更多