【问题标题】:How to check if a pointer points to an array or single int or char如何检查指针是否指向数组或单个 int 或 char
【发布时间】:2021-03-15 19:40:05
【问题描述】:

我想知道一个指针是指向一个数组还是单个整数。我有一个函数,它接受两个指针(intchar)作为输入,并判断指针是指向 array 还是单个 >整数

pointer=pointer+4;
pointer1=pointer1+4;

这是个好主意吗?

【问题讨论】:

  • 没有便携的方法可以做到这一点。
  • @Donnie,也不是那种不可移植的方式。
  • OP:为什么你需要知道它是指向一个数组还是单个整数?你真正想解决什么问题?
  • @SergeyA 您偶尔可以获取分配大小并尝试根据原语的大小进行猜测,但是是的,您仍然只是在猜测。

标签: c++ pointers


【解决方案1】:

就像其他人在这里所说的那样,C 不知道指针指向什么。但是,如果您应该选择走这条路,您可以在整数或数组中的第一个位置放置一个标记值以指示它是什么...

#define ARRAY_SENTINEL -1

int x = 0;
int x_array[3] = {ARRAY_SENTINEL, 7, 11};

pointer = &x_array[0];

if (*pointer == ARRAY_SENTINEL)
{
   // do some crazy stuff
}

pointer = &x;

if (*pointer != ARRAY_SENTINEL)
{
   // do some more crazy stuff
}

【讨论】:

  • 只有当您可以保证指针指向的单个int 对象不会碰巧包含值-1 时才有效。 (顺便说一句,宏应该用括号括起来,而你拼错了SENTINEL。)
  • 另外你可能错过了我们说的是 C++ 而不是 C。
  • 0xDEADBEEF(或类似的)会比 -1 成为一个更好的哨兵。
  • 在 C 和 C++ 中都是如此。两者都无法知道指针指向什么。是的,您需要提出一个独特的哨兵值。我不建议做我上面做的事情,但想回答他的问题。宏很好。
  • 我也忽略了“if”比较,但由于作者使用它来确定 int 与 int 数组,所以没有必要。
【解决方案2】:

这不是一个好主意。仅使用原始指针无法知道它们是指向数组还是单个值。

用作数组的指针和指向单个值的指针是相同的——它们都只是一个内存地址——因此没有可用于区分它们的信息。如果您发布您最终想要做的事情,可能会有一个不依赖于比较指向数组和单个值的指针的解决方案。

【讨论】:

  • 指针不“用作数组”。数组和指针是不同的东西。请参阅comp.lang.c FAQ 的第 6 节。
  • @KeithThompson,我不同意你的评论。指针不是数组,但指针可以用作数组。这个答案没有错。
  • @SergeyA:“将指针用作数组”到底是什么意思?
  • @KeithThompson,例如,使用数组下标运算符。 (不要告诉我数组下标运算符可以用在整数常量中,这不是重点)。指针也可以参与指针算术,这只是为数组定义的。
  • @KeithThompson,仍然,用外行的话来说,这被认为是所有数组使用之母(并且操作符名称中甚至包含单词 array)。
【解决方案3】:

实际上,指针指向一块内存,而不是整数或数组。无法区分整数是单个变量还是整数是数组的元素,两者在内存中看起来完全相同。 你可以使用一些 C++ 数据结构,例如 std::vector 吗?

【讨论】:

    【解决方案4】:

    对于 C++ 问题,答案很简单。不要在 C++ 中使用 C 风格的动态数组。当你需要一个 C 风格的动态数组时,你应该使用std::vector

    这样你就永远猜不到指针指向什么,因为只有std::vector 会持有一个数组。

    【讨论】:

    • 我同意那个匿名的反对者。在某些应用程序中,动态分配的数组更(稍微)有效,因此更好用。据我所知,'std::vector' 用于动态工作 - 你想以不可预测的方式添加和删除元素,但是如果你需要编写一些算法,其中数组的大小是已知的并且不会改变在执行期间,'std::vector' 完全是矫枉过正。例如 [链接] (en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm)。
    • 但我想,否决票是为了你的题外话。
    • @RainbowTom,你错了。与动态 C 样式数组相比,C++ 向量提供相同或更好的性能。而且我不认为它离题,它非常离题,因为它暗示了做同样事情的更好方法。
    • 你能给我一些更好的论据吗?链接到一些文档、博客等。我是一名学生,我想了解:)
    • @RainbowTom,从谷歌开始。 'std::vector vs C-style array 的性能'是一个很好的开始查询。
    猜你喜欢
    • 2018-04-05
    • 2021-07-28
    • 2011-06-07
    • 2017-09-03
    • 1970-01-01
    • 2021-01-26
    相关资源
    最近更新 更多