如何判断指针是否是指向数组的指针
How to tell if a pointer is the pointer to an array?
考虑这个
template <class T>
inline constexpr bool found_to_be_array (T* specimen)
{
if constexpr (std::is_array_v<T>) {
return true;
}
else {
return false;
};
}
问题是,在何种情况下,这将产生可靠的结果?
澄清:我无法更改此功能的占地面积。我没有答案,所以让我在这里发布我的发现。考虑一下:
int ia[]{ 1,2,3,4,5,6,7,8,9,0 };
int iam[3][3][3][3][3]{};
// returns false
auto is_array_1 = found_to_be_array(ia);
// returns true
auto is_array_2 = found_to_be_array(iam);
我仍在研究这个问题,但对于多维数组,found_to_be_array
是有效的。
https://godbolt.org/g/ij73Z4
不,这种方法不起作用。参数specimen
已经衰减为指针类型(或者它甚至可能一直是指针(;CCD_ 3使用的元编程技术不会以某种方式追溯到调用方。
此外,您正在测试(无意中?(T
而不是T*
,但更改为后者是行不通的。
如何判断指针是否是指向数组的指针?
指针有类型,这表明它指向什么。当它指向数组时,指针的类型反映了这一点,例如:
int arr[2][2] = {{1,2},{3,4}};
auto x = &arr[0];
在这种情况下,x
的类型为int(*)[2]
——指向2个int
的数组的指针,在这种情况中为{1,2}
。如果将该指针增加1,它将指向下一个由2个int
s组成的数组,即{3,4}
。如果你把这个指针传给你的函数,T将被推导为int[2]
,结果将是true
;
在1D阵列的情况下也没什么不同:
int arr[4] = {1,2,3,4};
auto x = &arr;
x
类型将为int(*)[4]
,它也将工作,函数将返回true
。
但是,如果将数组传递给函数而不是指针,从而迫使它衰减为指向其第一个元素的指针,则数组信息将丢失,因为指针现在的类型为int
。
auto x = arr;
这里的x
是int *
类型,它不是指向数组,而是指向第一个int
,即1
。如果您将其增加1,它将指向下一个int
,即2
,依此类推。如果这是指向数组的指针,则如果您将它增加1,则它将指向数组结束后的下一个字节。将此指针传递给函数将返回false
,因为int
类型不是数组。
因此,为了回答您的问题,您可以判断指针是指向数组的指针,因为这些信息将在指针类型中提供。
int iam[3][3][3][3][3]{}; // returns true auto is_array_2 = found_to_be_array(iam);
iam
衰减到指向其第一个元素的指针,基本上是在测试iam[0]
是否是一个数组,它确实是,因此它可以工作。
一个非null数据指针是否指向数组元素,总是得到答案可能。
你问为什么
该语言明确允许您将任何对象视为一个数组的单个元素。当你需要一个序列,想要复制一个琐碎的对象,或者诸如此类的时候,这是非常漂亮的。
因此,每个指针都是以下之一:
- 为空指针
- 指向数组的元素的指针
- 指向数组元素之外的指针,或者
- 无效,表示
- wild,表示从未初始化,或
- 晃来晃去,这意味着指针对象的生命结束了
虽然您可以区分情况1和2或3,但其余情况可能需要分析程序当前运行的完整历史。
您不能更改函数的要求很奇怪/不合理。
如果不能更改函数签名,则无法检测参数是如何生成的(从ptr或数组(,因为该信息已丢失。
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 将基本实例指针强制转换为派生实例指针是否合法?(实例不是派生实例)
- 如何判断指针是否是指向数组的指针
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 检查指针是否是带有变异模板的派生的指针
- 在特殊情况下使析构函数不是虚拟的,并删除基指针是否安全
- 我可以查询是否是动态分配数组中的第一个指针
- 我怎么知道内存中的变量是否是指针
- 测试指针是否为null的最有效方法是什么?
- 重载指向集合的指针的开始/结束是否是个好主意
- 如果 C# 指针被认为是"unsafe,"这是否意味着C++指针也是"unsafe"?
- 取消引用悬空指针是否是未定义的行为
- 取消引用等于 nullptr 的指针是否是标准的未定义行为?
- 取消引用无效指针但不使用结果是否是C++中的未定义行为
- 使用指针作为类成员是否是一种好的做法
- 在每个可能的地方使用指针是否是一种好习惯
- 如何从指向GDB基类的指针确定对象是否是某个派生c++类的实例