指向数组转换的指针
Pointer to array conversion
8.3.4/8 N3797:
[示例:
考虑
int x[3][5]
;这里
x
是一个3×5的整数数组。当x
出现在表达式中时,它将转换为指向(三个中的第一个)五元整数数组。在表达式中等价于*(x+i)
、x
的x[i]
首先被转换为指针如所述则x+i
转换为x
的类型,包括将CCD_ 9乘以指针所指向的对象的长度,即五个整数对象〔…〕
由于x
的类型是"由5个整数组成的3个数组的数组",所以我们也有x+i。假设i = 2;
x + i
(称为arr
)元素在转换为由3个5个整数组成的数组后的值是多少?我的意思是arr[3]
等于什么?
arr[3]
是一个由五个整数组成的数组。原因如下:
当x出现在表达式中时,它将转换为指向(三个中的第一个)整数的五元数组
这意味着在表达式中使用CCD_ 16将导致具有类型CCD_。
对于相当于*(x+i)
的x[3]
,首先将x转换为int(*)[5]
类型并将其推进,然后取消引用该指针(记住*),从而获得类型int[5]
。
不幸的是,指针指向了一个无效的内存点,因此对这个由五个整数组成的数组的任何操作都是未定义的行为/访问冲突。
我同意这段话真的不清楚,这两个句子似乎是一个在另一个之前(也有点晦涩)。
我会把它改写为:
这里x是一个3×5的整数数组。当x出现在表达式中时,它被转换为指向(三个中的第一个)五元的指针整数数组。在表达式x[i]中,它等价于*(x+i),x首先被转换为所描述的指针;在指针增量x+i之后(按字节方式,这包括将i乘以长度指针指向的对象,即五个整数对象),x+1将被转换为x指向的类型[…]
相关文章:
- 正在将指针转换为范围
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++:Lambda 函数指针转换的用例是什么?
- 如何将 int 指针转换为浮点指针
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 将(N 个字节)无符号字符指针转换为浮点数和双 C++
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- C++中数组大小未知的指针转换
- Antlr cpp 运行时 任何错误的指针转换?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- C 指针转换会导致内存访问冲突
- 模板类实例化中的指针转换无效
- 函数调用歧义(用户定义的转换和 Derived2Base 指针转换)
- 如何将 void(*)() 类型的指针转换为 void*
- 数组到指针转换期间的临时具体化
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 将基类指针转换为派生的类指针
- 应对 std::字符串中的 std::<char>指针转换后的向量
- 在编译时将函数指针转换为 std::uintptr_t
- 将基类指针转换为未知派生类指针