我几天来一直在更新服务器项目的代码。 我发现了一条我无法理解的行(已被评论过)
首先,我得到:
int *t;
然后我得到了这个(评论):
t[*t];
这个" t [* t]"的类型是什么?
答案 0 :(得分:2)
类型是int
左值。我们有两个部分:
*t // this is an int
t[ some int ] // this is standard array indexing
或者举个简单的例子:
int array[] = {1, 2, 3, 4};
int* t = array;
使用该设置:
t[*t] == t[1] == 2
或者:
t[*t] = 7;
// now array[] holds {1, 7, 3, 4}
答案 1 :(得分:1)
类型为int
*t
相当于t[0]
,因此您的表达式等同于以下内容:
t[*t] == t[t[0]] == t[offset]
(如果您考虑offset = t[0]
)
答案 2 :(得分:0)
有时代码是通过键入符号的数量来估算的。所以我会写一个更令人困惑的代码,但有更多的字符,如:)
( t + *t )[*t];
相对于你的例子
*t
是存储在t
中的某个整数,*t
相当于t[0]
。因此,在表达式t[*t]
中,使用了指针算法
t + *t
或
t + t[0]
给出一些新的指针然后被解除引用
*( t + *t )
答案 3 :(得分:0)
根据语言的定义,假设t
是指针,表达式t[*t]
完全等同于表达式*(t + *t)
。
要分析该表达式的类型,让我们从内到外看一步步骤。我将用«type»
替换每个表达式的整个类型。
由于t
的类型为int*
,我们有*(«int*» + *«int*»)
。
取消引用int*
会得到一个类型为int
的左值。因此,我们得到*(«int*» + «int»)
。
现在向指针添加一个整数再次给出了一个相同类型的指针,因此表达式减少到*«int*»
。
但是,再次,只是取消引用指向int
的指针,因此表达式的最终类型是左值int
。
答案 4 :(得分:0)
operator[]
始终的int*
会返回int
。
由于*t
只返回t
的第一个元素,t[*t]
是t
的第一个元素所指向的t
的元素。
示例:
int *t;
t=new int[5];
for(int i=0;i<5;++i){
t[i]=i+1;
} // t now points to {1,2,3,4,5}
t[*t]; // <--- What does this evaluate to?
在这种情况下,t[*t]
将是2.
由于*t
为1,t[1]
是数组中的第二个元素,即2。