地址数据的大小

时间:2014-04-19 19:29:33

标签: c pointers

c语言中指针指向的地址包含多少数据(字节,2字节),还是依赖于指向的数据类型?

2 个答案:

答案 0 :(得分:2)

我不完全确定你的意思"指针指向的地址"。我假设你指的是它指向的对象,而不是指针本身的大小。

您的问题的答案可能取决于您的意思"地址"。

C指针值不仅仅是原始内存地址(尽管它通常以这种方式实现)。指针值指的是特定类型的对象,该类型指定指向对象的大小。并且C标准相当一致地使用"地址"引用(非空)C指针值。

另一方面,单词"地址"通常用于指代原始内存地址,可以被认为指向单个字节。但另一方面,即使在机器代码级别上,地址所指的数据大小也取决于您使用它做什么。 (我甚至在机器地址只能指向64位字的系统上工作;字节操作完全由软件完成。)

类型为int*的指针指向int个对象。根据定义,该对象的大小为sizeof (int)字节(通常为4个字节,但如果一个字节至少为16位,则可以是8,或2,甚至1)。类似地,类型struct foo*的指针指向struct foo对象,该对象可以是任意大小。

int*指针并不指向int对象的第一个字节,它指向整个int对象。 (但如果将int*指针转换为char*,结果将指向"第一个"字节。)

作为一种特殊情况,类型void*的指针指向内存中的某个位置,但不指定它指向的对象的大小。在将其转换为其他指针类型之前,您无法取消引用它。

推荐阅读:comp.lang.c FAQ的第4部分。

答案 1 :(得分:1)

这是一个非常哲学的问题,让我给你三个完全不相容的答案:

  • 指针本身显然指向1字节
  • 取决于指针的类型,指针指向数据块的第一个字节,其大小由指针类型定义
  • 指针指向某些数据的第一个字节,其可用长度既不是确定的,也不是从程序内部确定的

虽然我认为所有三个答案在技术上都是正确的,但第二个答案是在C语言编程时使用的。

修改

详细说明"地址"可以,可能或应该,请在下面的评论中查看@ KeithThompson的输入!