c++ - 比较相同类型的指针是否安全?

标签 c++ pointers c++11 comparison

char** buffer{ /* some buffer */ };
char* ptr1{buffer[0]};
char* ptr2{buffer[10]};

assert(ptr1 < ptr2);

如果两个指针指向同一缓冲区中的不同位置,比较它们是否安全?

我想通过比较来了解指针范围是否有效:assert(rangeBeginPtr < rangeEndPtr) .

最佳答案

您可以将指针与关系运算符( <><=>= )进行比较,前提是它们都指向同一数组的一个元素,或者指向该数组之后的元素。根据 C++11 5.9 Relational operators,其他任何行为都是未指定的行为.所以,给定:

char xyzzy[10];
char plugh[10];

所有这些都被指定为正常运行:

assert(&(xyzzy[1]) < &(xyzzy[4]));
assert(&(xyzzy[9]) < &(xyzzy[10])); // even though [10] isn't there.

但这些不是:

assert(&(xyzzy[1]) < &(xyzzy[15]));
assert(&(xyzzy[9]) < &(plugh[3]));

除了如果您比较同一数组中的两个元素,它必须是同一类型之外,类型不会出现在其中。如果你有两个 char *变量,如果它们指向不同数组,则未指定,即使它们具有相同类型。

关于c++ - 比较相同类型的指针是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18444566/

相关文章:

c++ - 具有智能指针和析构函数的单例类被调用

c++ - 如何在具有 <500 MHz 时钟、<256 MiB RAM 并使用基于 Yoctominimal 的自定义 Linux 的单核机器上优化事件轮询线程

c - 结构体中的指针放置在两个结构体成员上

c++ - std::queue 位置的包装器

c++ - 模板函数错误, "no matching function for call to..."

c - 我无法确定为什么这个 C 程序会给我这个答案

c++ - 当操作的变量是 const 时,如何修复括号/索引运算符重载?

c++ - 从数组中存储和读取字符串

c++ - 将 C 编译为 C++ 链接器错误(lua 和 oolua)

char** 来处理字符串?