2011-11-18 110 views
3
int array[10] = {1,2,3,4,5,6,7,8}; 
int *ptr = array; 
std::cout<<*(ptr+ 2); => O/P = 3 

int (*arr_ptr)[10] = &array; 
std::cout<<*(*arr_ptr+2); => O/P = 3 

這兩者之間有什麼區別?我知道它們的含義,但是如果它們給出相同的結果,爲什麼我們有兩個不同的符號?陣列和指針

+0

我們有不同的符號,因爲有不同的方式來表達的概念。就像自然語言有同義詞。 – drdwilcox

+0

但是這裏ptr指向數組[0],但是* arr_ptr指向數組[0] ...所以它最好使用ptr符號嗎? – Mayuresh

+0

我已經把'arr_ptr'的類型並編輯了你的問題。看看它是否正確。 – iammilind

回答

3

第一種情況是正常情況:ptr是一個指針到陣列array的第一個元素,並且其索引(使用*(ptr+2),這是ptr[2]的同義詞)訪問該陣列的第三個元素。

第二種情況是人爲的:​​是指向(enitre)數組array的指針。它首先被解除引用(使用*arr_ptr)以產生數組本身,然後將其用作二進制+的參數,這會使其隱式轉換爲指向其第一個元素的(無名稱)指針,然後將其索引爲相同方式*(<nameless pointer>+2)並給出了相同的結果。

使那些隱式轉換明確的,你可以寫

int *ptr = &array[0]; 
std::cout<<*(ptr+ 2); 

int (*arr_ptr)[10] = &array; 
std::cout<<*(&(*arr_ptr)[0] + 2); 
0

使用你理解了符號和適合的問題域。如果你的應用程序有一個數組,然後使用數組表示法。如果由於其他原因必須推送指針,那麼第二個版本是適當的。

1

編輯你的問題,繼後的差異:

(1) int *ptr = array; 

array被衰減到指針。 ptr理想地允許指向任何int[]無論其大小

(2) int (*arr_ptr)[10] = &array; 

​​的是一個指向int[10]。這是非常具體的定義,你不能指定一個數組​​其大小不是10

int array_2[20]; 
arr_ptr = &array_2; // error 
+0

是的,但我認爲並不需要&運算符。 – Mayuresh

+0

@Mayuresh,它在**指向數組**的情況下是必需的。否則,它會給[編譯器錯誤](http://www.ideone.com/WHNpG)。 – iammilind

+0

非常感謝Milind – Mayuresh

0

它們實際上與編譯器不一樣,會導致生成不同的彙編語言。

這裏是關於差別一些很好的參考:http://cplusplus.com/forum/articles/10/

+0

非常感謝... – Mayuresh

+0

沒問題..雖然我現在第二次猜測自己,第二部分你的例子,我不確定當你聲明/初始化指針數組時會發生什麼。我懷疑它可能靜態分配10個指針的空間,但我不確定。 – snapfractalpop