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
這兩者之間有什麼區別?我知道它們的含義,但是如果它們給出相同的結果,爲什麼我們有兩個不同的符號?陣列和指針
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
這兩者之間有什麼區別?我知道它們的含義,但是如果它們給出相同的結果,爲什麼我們有兩個不同的符號?陣列和指針
第一種情況是正常情況: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);
使用你理解了符號和適合的問題域。如果你的應用程序有一個數組,然後使用數組表示法。如果由於其他原因必須推送指針,那麼第二個版本是適當的。
編輯你的問題,繼後的差異:
(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
它們實際上與編譯器不一樣,會導致生成不同的彙編語言。
這裏是關於差別一些很好的參考:http://cplusplus.com/forum/articles/10/
非常感謝... – Mayuresh
沒問題..雖然我現在第二次猜測自己,第二部分你的例子,我不確定當你聲明/初始化指針數組時會發生什麼。我懷疑它可能靜態分配10個指針的空間,但我不確定。 – snapfractalpop
我們有不同的符號,因爲有不同的方式來表達的概念。就像自然語言有同義詞。 – drdwilcox
但是這裏ptr指向數組[0],但是* arr_ptr指向數組[0] ...所以它最好使用ptr符號嗎? – Mayuresh
我已經把'arr_ptr'的類型並編輯了你的問題。看看它是否正確。 – iammilind