最近在複習c語言的時候,很多人對指標,指標變數以及二維陣列指標理解不了。
指標與指標變數的區別:
值。
聯絡:形如 int a=1;這裡a是乙個變數,1是個確定的值,可以說左邊的a是變數右邊是值,同樣的道理 int *p=&a;這裡左邊的p是指標變數,右邊就是指標(位址)。不過,通常我們敘述的時候會把指標變數簡稱為指標實際上兩者並不是同乙個慨念。
int main()
輸出:100 100;
有人不解a為什麼是100了,實際上他們指向的同一內容。具體內容改變,肯定改變
舉例:教學樓房間位址301(301就是位址,相當於&a)。上面掛這著牌"校長辦公室(這門牌就是變數a)"。突然來了個小明想去校長辦公室,別人告訴他校長辦公室在301(相當於p=&a=301)。於是他找到了校長辦公室。他的職責就是為辦公室新增椅子。原來校長辦公室有五把椅子。小明找到301將裡面的椅子增加到100吧(*p=100);現在問a的值等於多少?就是問掛著「校長辦公室」的房間有多少把椅子,問*p的等於多少就是問301有多少椅子。椅子數肯定是一樣的。
這對初學者來說比較難理解。先來看一段程式:
int main()
輸出結果:
估計你早已經矇圈,乙個位址和內容怎麼可能相等。事實上確實如此,a+i並不是乙個變數,*(a+i)也不是乙個指標變數,a+i是乙個常量a+i這個指標實際是沒有乙個記憶體單元來儲存的
,*(a+i)是乙個常量指標。
a+i還是2維指標,*(a+i)則是一維指標。編譯器對它們的解析和操作是不一樣的
a記錄是首址,所以a+1,相當偏移乙個單元(行),而又因為a是二級指標,所以*(a+1)之後跳到了一維指標所以取得的還是a偏移乙個單元的位址(很難理解。。就是*(a+i)取值了變成了乙個位址。它的值就是他的位址)
這裡方便理解記住*(a+1)的*的作用是將行指標轉換為列指標。沒有*表示的時候就是行指標
如a+1,就是第一行首位址
如果加上了*就要從行列分析
如*(a+1)就是相當與*(a+1)+0表示指標變數先找了第一行,加上個*後指標變為列指標。開始在該行上尋找偏移的位址,偏移的位址為0即表示的是第一行0列的位址也就是&a[0][1];
a[i] 就表示的是第 i 行的首位址,也就是 a[i][0]這個元素所在的位址;
&a[i] 取得a[i][0]的位址,代表的是i行0列的位址,是 a[i][0]的位址。
所以a+1=*(a+1)=a[1]=&a[1]=&a[1][0]
二維指標趣談
先看一段 include void fun int pptemp int main 如果看到fun null 的呼叫,不要懷疑,故意寫成這樣的,目的很簡單,就是產生乙個錯誤。在執行到 pptemp ptemp後,程式在系統中會產生段錯誤,也就是說在給null值取位址的 時候,系統會自我保護。說明 系...
二維陣列和指標 和指標陣列,陣列指標
2007 09 12 19 45 7842人閱讀收藏 舉報 二維陣列和指標 用指標表示二維陣列元素。要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。我們知道,乙個二維陣列在計算機中儲存時,是按照先行後列的順序依次儲存的,當把每一行看作乙個整體,即視為乙個大的陣列元素時,這個儲存的二...
二維陣列 二維陣列和指標
include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...