2014-12-07 31 views
0

我正在更新一個服務器項目的代碼,因爲天。 我發現了一個行,我無法理解(這是評論)Int * t;和這個t [* t] - 類型定義

首先,我得到:

int *t; 

然後我得到這個(評論):

t[*t]; 

什麼的這種類型「t [* t]」

回答

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} 
+0

它也是完全不可讀在第二元件。只是說。 (不是你的代碼,'t [* t]')。 – keyser 2014-12-07 20:58:24

+0

@keyser:如果這是不可讀的('t [* t]'),請等到最簡單的模板或其他任何東西。 – Deduplicator 2014-12-07 21:00:53

+0

謝謝你的回答!但你如何得到int和int?因爲我雖然類型是詮釋? – John 2014-12-07 21:00:55

0

有時代碼由估計鍵入符號的數量。所以,我會寫一個更加混亂的代碼,但有更多的字符,如:)

(t + *t)[*t]; 

相對於你的例子

*t是一些整數存儲在t*t相當於t[0]。因此,在表達t[*t]那裏使用指針運算

t + *t 

t + t[0] 

給出其隨後被解除引用的一些新的指針

*(t + *t) 
1

類型是int

*t相當於t[0]因爲這樣你的表情相當於如下:

t[*t] == t[t[0]] == t[offset](如果你考慮​​)

0

由語言的定義,因爲t是一個指針,表達t[*t]是完全等價的表達*(t + *t)

要分析該表達式的類型,讓我們從內到外看一步一步。我會替換每個表達式整個類型被識別爲«type»

由於tint*,我們有*(«int*» + *«int*»)

提領int*給出int類型的左值。因此我們得到*(«int*» + «int»)

現在,將一個整數添加到指針中會再次得到一個相同類型的指針,因此該表達式簡化爲*«int*»

但是,也就是說,只是取消指向int的指針,因此表達式的最終類型是左值int

0

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

相關問題