为什么指针类型不受C ++限制?

时间:2014-04-17 18:35:03

标签: c++ gcc g++

我认为指针的最大值是使用指针大小的最高可能值,但显然不是。

#include <iostream>
#include <limits>

int main() {
  std::cout << std::numeric_limits<char *>::is_bounded << std::endl;
  std::cout << (void *)std::numeric_limits<char *>::min() << std::endl;
  std::cout << (void *)std::numeric_limits<char *>::max() << std::endl;
}

我使用g ++编译并获得以下输出:

0
0
0

标准说如果is_bounded不为false,则min()和max()是有意义的。它还说如果类型可表示的值集合是有限的,那么is_bounded应该为真。

指针是不是有限的,或者为什么is_bounded为false而max()在我的程序中为零?

3 个答案:

答案 0 :(得分:2)

<limits>标头未实现std::numeric_limits<char *>的特定重载。这意味着我们然后使用默认实现。

std::numeric_limits<T>::min()std::numeric_limits<T>::max()的默认实现是返回T(),这可以解释您获得0的原因。

您可以看到here std::numeric_limits<T>::is_bounded()实施的类型列表。

答案 1 :(得分:2)

指针本身就是一种类型,它是一种存储另一个变量地址的类型。 std::numeric_limits针对处理数字的类型进行操作。指针不是数字,它们是将地址存储到存储器位置的变量。虽然地址本身可以用数字表示,但这不会产生指针数字。

minmax对指针毫无意义。

32位指针可以存储最大32位大小的地址。就这样。 64位指针的最大大小为64位,这意味着它可以存储最大64位的地址。这与数字最小值或最大值

无关

答案 2 :(得分:2)

指针不是算术类型。

从18.3.2.1类模板numeric_limits

  

numeric_limits类模板为程序提供信息   关于实现的表示的各种属性   算术类型。应为每个人提供专业化   算术类型,包括浮点数和整数,包括bool。该   成员is_specialized对于所有这些专业都应该是真实的   numeric_limits。对于所有声明静态constexpr的成员   numeric_limits模板,专业化应定义这些值   这种方式可以用作常量表达式。   非算术标准类型,例如complex<T>(26.4.2),不得   有专业。

因此。你的测试应用非算术类型会导致无意义的默认值。