2014-10-02 28 views
-2
#include <iostream> 

using namespace std; 

int func(int arg0, int *arg1, int *arg2); 

int main() { 
    int *b; 
    int z; 
    int a[10]; 

    z = func(*a[0], &a[z], b+a[4]); 
} 

上面的代碼給了我一個錯誤「一元'*'(有'int')」的無效類型參數。我知道當在聲明中使用*時會創建一個指針,當它與變量名一起使用時,它將獲取存儲在該指針處的值。在函數func()中,它需要3個參數,1個int和2個int指針。我認爲傳遞給函數的第一個參數給了我一個錯誤,但我不明白爲什麼。 *a[0]不應得到a數組中第一個被聲明爲int的元素的值嗎?爲什麼這個指針沒有得到數組索引的值?

+0

'*'不是'int'的一元運算符。這正是'a [0]'的意思。 – WhozCraig 2014-10-02 04:58:02

回答

1

沒有,*上的指針使用時取消引用指針。但是,[0]已經等同於:

*(a + 0) // And since the offset is 0, this is equivalent to *a. 

換句話說,解引用指針已經偏移,讓您在給定的「索引」項的值數組的開始。你寫的東西相當於:

**(a + 0) // And since the offset is 0, this is equivalent to **a. 

因此,你正試圖'取消引用'一個int,這是行不通的。由於*不是int的有效一元運算符,因此失敗並導致出現錯誤。

1

*a[0]**a相同。

鑑於聲明int a[10];,應該很清楚您無法取消兩次a的取消引用。

如果你想要第一個元素的數組a,那麼這只是a[0]

你也可以簡化你的榜樣此,仍然得到了同樣的錯誤:

int main() { 
    int a[10]; 
    int b = *a[0]; 
} 
+0

所以當訪問一個數組中的元素時,它會自動解引用它? – AvP 2014-10-02 05:06:12

+0

@AvP基本上,是的 - 它取消引用已被您指定的索引抵消的指針 - 我在我的答案中添加了一個解釋。 – Ideasthete 2014-10-02 05:34:57

相關問題