C++ 如何检查指针是否指向数组或单个int或char

C++ 如何检查指针是否指向数组或单个int或char,c++,pointers,C++,Pointers,我想知道指针是指向数组还是单个整数。我有一个函数,它将两个指针(int和char)作为输入,并判断指针是指向数组还是单个整数 pointer=pointer+4; pointer1=pointer1+4; 这是个好主意吗 这不是个好主意。仅使用原始指针无法知道它们是指向数组还是单个值 用作数组的指针和指向单个值的指针是相同的—它们都只是一个内存地址—因此没有用于区分它们的信息。如果您发布了最终要做的事情,那么可能有一种解决方案不依赖于将指针与数组和单个值进行比较 正如其他人在这里所说,C不知道

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

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

这是个好主意吗

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


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

正如其他人在这里所说,C不知道指针指向什么。但是,如果您选择沿着此路径前进,您可以在整数或数组中的第一个位置放置一个sentinel值,以指示它是什么

#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
}

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


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

实际上指针指向的是一段内存,而不是整数或数组。无法区分整数是单变量还是整数是数组的元素,两者在内存中看起来完全相同。

你能使用一些C++数据结构,例如:STD::vector?< /P>没有可移植的方式来做这个。“唐尼,不是那么不可移植的方式。”OP:为什么你需要知道它是指向数组还是单个整数?你真正想解决的问题是什么?@SergeyA你偶尔可以得到分配大小,并尝试根据原语的大小进行猜测,但你仍然只是猜测。指针不是“用作数组”。数组和指针是不同的东西。见《基思汤普森》第6节,我不同意你的评论。指针不是数组,但指针可以用作数组。这个答案没有错。@SergeyA:“将指针用作数组”到底是什么意思?@KeithThompson,例如,使用数组下标运算符。(不要告诉我数组下标运算符可以用于积分常量,它不是点)。指针也可以参与指针算术,指针算术只为数组定义。@KeithThompson,用外行的话来说,这被认为是所有数组用法之母(操作符名中甚至有单词array)。仅当您可以保证指针指向的单个
int
对象不包含值
-1
时,此操作才有效。(顺便说一下,宏应该是括号,你拼写错了<代码> StimeNe>代码>)你可能还错过了我们正在谈论的C++,而不是C.0xDead Brand(或类似)会比-1.0更好地定位。这在C和C++中都是正确的。他们都不知道指针指向什么。是的,你需要想出一个独特的哨兵值。我不建议像上面那样做,但我想回答他的问题。宏很好。我也忽略了“if”比较,但因为作者使用它来确定int与int数组,所以没有必要。我同意这个观点。还有一些应用程序,动态分配的数组更有效(稍微有效),因此使用起来更好。据我所知,“std::vector”用于动态工作—您希望以不可预测的方式添加和删除元素,但如果您需要编写一些算法,其中数组的大小是已知的,并且在执行过程中不会更改,“std::vector”完全是多余的。例如[link]()。但我想,投反对票的是你的离题答案。@RainbowTom,你错了。与动态C样式数组相比,C++矢量提供了相同或更好的性能。我不认为它是离题的,它是非常离题的,因为它提出了做同样事情的更好方法。你能给我一些更好的论点吗?链接到一些文档、博客等。我是一名学生,我想了解:)@RainbowTom,从谷歌开始std::vector vs C-style数组的性能是一个很好的开始查询。