指针只存储内存地址吗?

时间:2014-08-10 14:41:35

标签: c

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

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

但是每个指针都有一个类型,如int *pointerlong *p等等。 int *pointer表示" p是指向int"。

的指针

我的问题,如果我们写

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

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

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

4 个答案:

答案 0 :(得分:5)

  

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

整数可以,但int不能。无论您的环境中有多大,它的大小都是一成不变的(在该环境中)并且在运行时不会发生变化。 int *仅指向int,而不指向long。请注意,如果出现任何此类问题,它们会同等地影响int x;

因此指针实际上只存储内存地址。有关指针对象大小的信息在类型中(正如非指针变量的类型告诉编译器该变量有多大)。

答案 1 :(得分:4)

确保您不会混淆硬件的功能与编译器的功能。就硬件而言,指针是存储器位置的地址。内存位置包含的内容以及数据的长度无关紧要。指针也不存储任何东西。它指向一个位置,这就是全部。在汇编中,这类似于使用指向内存位置的寄存器。

编译器跟踪指向位置的数据类型。编译器的工作是避免出现类型错误。这是有些人抱怨你可以用C射击自己的地方。可能有指针指向数据位置,其中数据可以是任何长度和任何长度。

答案 2 :(得分:0)

  

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

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

  

程序怎么知道应该用多少位数来存储整数99?

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

答案 3 :(得分:0)

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