C++ vec[i][j]是否翻译成*(vec+i+j)?

C++ vec[i][j]是否翻译成*(vec+i+j)?,c++,C++,例如,我们可以通过两种方式引用一维数组的元素: 向量[i]或*vec+i vec[i][j]如何转换为2d数组?一种逻辑方法-如果a[x]是*a+x的合成糖,那么让我们展开整个表达式: vec[i][j] (*(vec + i))[j] *((*(vec + i)) + j) 剥去一对帕伦,我们得到: *(*(vec + i) + j) 所以vec[i][j]不等于*vec+i+j,而是**vec+i+j。由于两个运算符应用程序,有两个解引用。因为只有一个解引用,所以第一个表达式转换为vec

例如,我们可以通过两种方式引用一维数组的元素:

向量[i]或*vec+i

vec[i][j]如何转换为2d数组?

一种逻辑方法-如果a[x]是*a+x的合成糖,那么让我们展开整个表达式:

vec[i][j]
(*(vec + i))[j]
*((*(vec + i)) + j)
剥去一对帕伦,我们得到:

*(*(vec + i) + j)
所以vec[i][j]不等于*vec+i+j,而是**vec+i+j。由于两个运算符应用程序,有两个解引用。因为只有一个解引用,所以第一个表达式转换为vec[i+j]

请注意:当您使用vector时,这两个过程编译为相同的程序集,这意味着它们是等效的;为了可读性/简单性,我使用::迭代器而不是普通向量:

char fn(vector<vector<char>::iterator>::iterator vec, char i, char j) {
    return vec[i][j];
}

char fn2(vector<vector<char>::iterator>::iterator vec, char i, char j) {
    return *(*(vec + i) + j);
}
逻辑方法-如果A[x]是*A+x的同义词,那么让我们展开整个表达式:

vec[i][j]
(*(vec + i))[j]
*((*(vec + i)) + j)
剥去一对帕伦,我们得到:

*(*(vec + i) + j)
所以vec[i][j]不等于*vec+i+j,而是**vec+i+j。由于两个运算符应用程序,有两个解引用。因为只有一个解引用,所以第一个表达式转换为vec[i+j]

请注意:当您使用vector时,这两个过程编译为相同的程序集,这意味着它们是等效的;为了可读性/简单性,我使用::迭代器而不是普通向量:

char fn(vector<vector<char>::iterator>::iterator vec, char i, char j) {
    return vec[i][j];
}

char fn2(vector<vector<char>::iterator>::iterator vec, char i, char j) {
    return *(*(vec + i) + j);
}
不,vec[i][j]与*vec+i+j不同;这实际上就是向量[i+j]

因为

内置的下标表达式E1[E2]与表达式*E1+E2完全相同

那么vec[i]与*vec+i相同;vec[i][j]与*vec[i]+j相同,然后是**vec+i+j。

不,vec[i][j]与*vec+i+j不同;这实际上就是向量[i+j]

因为

内置的下标表达式E1[E2]与表达式*E1+E2完全相同

那么vec[i]与*vec+i相同;vec[i][j]与*vec[i]+j相同,然后是**vec+i+j.

正确答案 在阅读了说明vec实际上不是数组而是std::vector的注释后,下面的答案是不正确的

因此,正确的答案是:这是不一样的,并且没有严格的相关性,因为两个向量都独立地分配和重新分配它们的元素。所以,你在vec中查找第i个向量,然后询问第j个元素,它位于data+i,但你不知道数据可能在哪里,它与另一个向量的存储无关

错误的答案 有趣的是,标准的作者似乎已经意识到他们的写作是多么令人困惑,因为标准中包含一个注释:用一个明确的例子来解决你的问题:

[ 注:多维数组遵循一致规则。如果E是秩为i×j×的n维数组⋯x k,则在经过数组到指针转换的表达式中出现的E被转换为指向n的指针−秩为j×的一维数组⋯×k.如果*运算符作为下标的结果显式或隐式应用于此指针,则结果是指向n的−一维数组,该数组本身立即转换为指针[ 例如:考虑

int x[3][5]

这里x是一个3×5的整数数组。当x出现在表达式中时,它被转换为指向三个五元整数数组中第一个的指针。在表达式x[i]它相当于*x+i,x首先被转换成一个指针,如前所述;然后x+i被转换成x的类型,它涉及到将i乘以指针指向的对象的长度,即五个整数对象。结果被相加并间接应用,以产生一个由五个整数组成的数组,然后再转换成一个pointer到第一个整数。如果有另一个下标,相同的参数将再次应用;这次的结果是一个整数。 — 结束示例 ]  — 尾注 ]

简而言之,vec[i][j]等于vec+i[j]等于**vec+i+j。请注意,如果您查看地址,数组的秩大小是如何重要的。因为不仅基础类型的大小在第一次解引用时相乘,这就是访问数组的工作方式。而且在第二次解引用时也会发生这种情况,而这里的类型恰好不是一个元素t、 而是一组已知大小的t。

正确答案 在阅读了说明vec实际上不是数组而是std::vector的注释后,下面的答案是不正确的

因此,正确的答案是:这两个向量不一样,也没有严格的相关性,因为两个向量都独立地分配和重新分配它们的元素。因此,所发生的事情是,你在vec中查找第i个向量,然后问第j个元素,它位于data+i,但你不知道数据可能在哪里,它与t无关他把另一个,包围着向量的储藏室

错误的答案 有趣的是,标准作家似乎已经意识到他们的作品是多么令人困惑 写作是因为标准包含一个注释:用一个明确的例子来解决你的问题:

[ 注:多维数组遵循一致规则。如果E是秩为i×j×的n维数组⋯x k,则在经过数组到指针转换的表达式中出现的E被转换为指向n的指针−秩为j×的一维数组⋯×k.如果*运算符作为下标的结果显式或隐式应用于此指针,则结果是指向n的−一维数组,该数组本身立即转换为指针[ 例如:考虑

int x[3][5]

这里x是一个3×5的整数数组。当x出现在表达式中时,它被转换为指向三个五元整数数组中第一个的指针。在表达式x[i]它相当于*x+i,x首先被转换成一个指针,如前所述;然后x+i被转换成x的类型,它涉及到将i乘以指针指向的对象的长度,即五个整数对象。结果被相加并间接应用,以产生一个由五个整数组成的数组,然后再转换成一个pointer到第一个整数。如果有另一个下标,相同的参数将再次应用;这次的结果是一个整数。 — 结束示例 ]  — 尾注 ]


简而言之,vec[i][j]等于vec+i[j]等于**vec+i+j。请注意,如果您查看地址,数组的秩大小是如何重要的。因为不仅基础类型的大小在第一次解引用时相乘,这就是访问数组的工作方式。而且在第二次解引用时也会发生这种情况,而这里的类型恰好不是一个元素t、 但是一个已知大小的Ts数组。

什么是vec类型?显然不是,因为vec 0+1等于vec 1+0,而vec 1+0不是同一个元素suming vec是一个数组!它将是**vec+i+j,与*vec[i]相同+jvector vec=new vectorwidth,vectorheight;vec的类型是什么?显然不是,因为vec 0+1将等于vec 1+0,它们不是相同的元素suming vec是一个数组!它将是**vec+i+j,与*vec[i]+jvector vec=new vectorwidth,vectorheight相同;