这些天我正在学习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指针是否不仅存储地址信息,还存储类型信息?
答案 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)
类型信息保留在源代码代码中,并由编译器用于执行类型检查和生成适当的代码,类型隐含在生成的代码中,而不是显式存储为数据