我正在更新一个服务器项目的代码,因为天。 我发现了一个行,我无法理解(这是评论)Int * t;和这个t [* t] - 类型定义
首先,我得到:
int *t;
然后我得到这个(评论):
t[*t];
什么的这种类型“t [* t]”
我正在更新一个服务器项目的代码,因为天。 我发现了一个行,我无法理解(这是评论)Int * t;和这个t [* t] - 类型定义
首先,我得到:
int *t;
然后我得到这个(评论):
t[*t];
什么的这种类型“t [* t]”
该类型是一个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}
有时代码由估计键入符号的数量。所以,我会写一个更加混乱的代码,但有更多的字符,如:)
(t + *t)[*t];
相对于你的例子
*t
是一些整数存储在t
是*t
相当于t[0]
。因此,在表达t[*t]
那里使用指针运算
t + *t
或
t + t[0]
给出其随后被解除引用的一些新的指针
*(t + *t)
类型是int
*t
相当于t[0]
因为这样你的表情相当于如下:
t[*t] == t[t[0]] == t[offset]
(如果你考虑)
由语言的定义,因为t
是一个指针,表达t[*t]
是完全等价的表达*(t + *t)
。
要分析该表达式的类型,让我们从内到外看一步一步。我会替换每个表达式整个类型被识别为«type»
。
由于t
是int*
,我们有*(«int*» + *«int*»)
。
提领int*
给出int
类型的左值。因此我们得到*(«int*» + «int»)
。
现在,将一个整数添加到指针中会再次得到一个相同类型的指针,因此该表达式简化为*«int*»
。
但是,也就是说,只是取消指向int
的指针,因此表达式的最终类型是左值int
。
int*
的operator[]
总是返回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
它也是完全不可读在第二元件。只是说。 (不是你的代码,'t [* t]')。 – keyser 2014-12-07 20:58:24
@keyser:如果这是不可读的('t [* t]'),请等到最简单的模板或其他任何东西。 – Deduplicator 2014-12-07 21:00:53
谢谢你的回答!但你如何得到int和int?因为我虽然类型是诠释? – John 2014-12-07 21:00:55