为什么指向数组表达式的指针起作用

德斯托普卡

我不明白为什么这段代码如此工作。我知道ptr是指向int数组的指针,它指向arr的第二个“行”。

int arr[][2] = { {1}, 2, 3};
int (*ptr)[2] = arr + 1;
cout << (**arr)[*ptr];

它打印3,arr[1][1]但它**arr是1,并且*ptr是的存储地址arr[1][0]
为什么(**arr)[*ptr]返回3?我在这里想念什么吗?

来自莫斯科的弗拉德

这个宣言

int arr[][2] = { {1}, 2, 3};

声明类型为两个元素的数组int[2]

这个表达

(**arr)

给出整数值1。

这个宣言

int (*ptr)[2] = arr + 1;

声明指向数组arr的第二个元素的指针。因此,* ptr返回数组arr的第二个“行”。在这样的表达式中使用

(**arr)[*ptr]

它被转换为指向其第一个元素的指针。

所以你有一个像

int[int *]

要么

i[p]

其中,i是整数值,p是指针。

那相当于

int *[int]

要么

p[i]

因为根据C ++标准(或C标准),两者的评估都像

*( p + i )

因此,当** arr等于1并且表达式* ptr指向第二行的第一个元素时,结果是第二行的第二个元素为3。

根据C ++ 17标准(5.2.1下标)

1后缀表达式,后跟方括号的表达式是后缀表达式。其中一个表达式的类型应为“ T的数组”或“ T的指针”,另一个表达式应为无范围的枚举或整数类型。结果为“ T”类型。类型“ T”应为完全定义的对象类型。64表达式E1 [E2](根据定义)与*((E1)+(E2))相同[注意:有关*和*的详细信息,请参见5.3和5.7。 +和8.3.4了解数组的详细信息。—尾注],但对于数组操作数而言,如果该操作数为左值则结果为左值,否则为x值。

那就是如果你有一个像这样的数组

T a[N];

T表达式时哪里有类型说明符

a[i]

相当于

i[a]

提供的i表示后缀表达式。

这是一个演示程序。

#include <iostream>

int main() 
{
    int a[] = { 1, 2, 3, 4, 5 };

    const size_t N = sizeof( a ) / sizeof( *a );

    size_t i = 0;

    while ( i != N ) std::cout << i++[a] << ' ';
    std::cout << '\n';

    return 0;
}

它的输出是

1 2 3 4 5 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

指向二维数组的指针(为什么起作用)

这个glob表达式如何/为什么起作用?

为什么此JSF表达式不起作用?

为什么我的Regex表达式不起作用?

为什么sum()在此dplyr表达式中起作用而Quantile()却不起作用?

为什么这样起作用:指向C字符串的指针数组?

当delete []指针起作用时,为什么不能获得所指向的数组的大小?

为什么我的正则表达式不起作用?[Java] [正则表达式] [空白问题]

即使正则表达式可以,为什么用正则表达式替换也不起作用?

表达式必须是指向完整对象类型的指针,为什么在这种情况下会出现此错误?

指向成员表达式UB的指针

指向表达式结果的指针

为什么此正则表达式在Notepad ++(Windows)中不起作用?

为什么RegExp.escape在我的Ruby表达式中不起作用?

为什么我的范围正则表达式语法不起作用?

为什么这个简单的条件表达式不起作用?

为什么我的LINQ表达式中的FindIndex不起作用?

为什么标记行首的正则表达式不起作用?

为什么此正则表达式在grep中不起作用?

为什么延迟匹配在此正则表达式中不起作用?

golang-为什么++和-在表达式中不起作用?

为什么我的C ++正则表达式不起作用?

为什么带有 \[ 的正则表达式不起作用

为什么与项目标签匹配的正则表达式不起作用?

发现:为什么带有egrep的正则表达式不起作用?

为什么在python中更改表达式时可变项不起作用?

为什么在 MySQL 中排序时 reg 表达式匹配不起作用?

为什么正则表达式在SQL Server Select语句中不起作用?

为什么Bash-in-Makefile表达式不起作用?