指向数组转换的指针

Pointer to array conversion

本文关键字:指针 转换 数组      更新时间:2023-10-16

8.3.4/8 N3797:

[示例:

考虑int x[3][5]

这里x是一个3×5的整数数组。当x出现在表达式中时,它将转换为指向(三个中的第一个)五元整数数组。在表达式中等价于*(x+i)xx[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指向的类型[…]