作者rm2slg (豪)
看板EE_DSnP
標題Re: [問題] 有關指標的問題
時間Thu Oct 7 00:36:42 2010
※ 引述《BBSealion (海獅)》之銘言:
以前就有個問題沒有想清楚
剛好今天老師上到,po在這請教大家一下
---
今天宣告一個雙層array :int arr[3][5] = {10,20,30, .......}
以下四行指令,竟然會顯示相同的結果?
cout << &arr[0][0];
cout << &arr[0];
cout << arr[0];
cout << arr;
都一樣顯示出一個位址(在我家是 0x22ff10)
感覺實在挺沒道理的
(1=3,2=4還算合理,但全部相同就是不太舒服orz)
也就是說arr = 0x22ff10 是一個位址
但用*取arr的值的話(*arr)還是會出現同樣的東西(地址) *arr = arr = 0x22ff10
再取一次(**arr)才會給你arr[0][0]的值(ex:10)
這樣不會有記憶體位址打架的問題嗎!?
同樣對0x22ff10這個位址,用*取值,一次還是給我0x22ff10,一次卻給我該位址的值
記憶體排列如下:
arr
↓
arr[0][0] arr[0][1] ... arr[1][0] arr[1][1] ...
取出arr[0][0]的位置,等於取出arr整個陣列的頭位置
同時你也可以說是arr[0](有5個變數的陣列,arr[0][0] arr[0][1] ... arr[0][4])
這個陣列的頭位置。對著arr[0]取址也就同理。
另外arr、*arr是不同的
arr是陣列名稱,丟給cout會給你位置
你對arr取值的話,他會告訴你arr[0]的內容
再取一次值,才告訴你arr[0][0]的內容
ps:改用動態宣告問題就解決了
(給另任意p,q)
int **c = new int*[p];
for (int i=0;i<p;i++){
c[i] = new int[q];
for (int j=0;j<q;j++){
*(c[i]+j) = 100*i+j*j;
}
}
以下四行指令
cout << &c[0][0] ;
cout << &c[0] ;
cout << c[0] ;
cout << c ;
第一行結果=第三行結果=0x2e24a0
第二行結果=第四行結果=0x2e2470
c[0]指標
↓
c[0][0] , c[0][1] ...陣列
所以c[0][0]位置是在記憶體另外開給陣列的位置(在heap)
c[0]本身是在stack中的一個變數
c[0]存的值就是他所指到的位置,也就是c[0][0]
c是一個指標陣列,他的開頭位置是c[0]
一點淺見,有請各位高手補充
※ 編輯: rm2slg 來自: 140.112.253.190 (10/07 00:44)