我正在更新一個服務器項目的代碼,因爲天。 我發現了一個行,我無法理解(這是評論)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