一. 二維陣列元素的位址
為了說明問題, 我們定義以下二維陣列:
int a[3][4]=, , };
a為二維陣列名, 此陣列有3行4列, 共12個元素。但也可這樣來理解, 陣列a由三個元素組成: a[0], a[1], a[2]。而它中每個元素又是乙個一維陣列, 且都含有4個元素 (相當於4列), 例如, a[0]所代表的一維陣列所包含的 4 個元素為 a[0][0], a[0][1], a[0][2], a[0][3]。如圖1.所示:
┏━━━━┓ ┏━┳━┳━┳━┓
a─→ ┃ a[0] ┃─→ ┃0 ┃1 ┃2 ┃3 ┃
┣━━━━┫ ┣━╋━╋━╋━┫
┃ a[1] ┃─→ ┃4 ┃5 ┃6 ┃7 ┃
┣━━━━┫ ┣━╋━╋━╋━┫
┃ a[2] ┃─→ ┃8 ┃9 ┃10┃11┃
┗━━━━┛ ┗━┻━┻━┻━┛
圖1.
但從二維陣列的角度來看, a代表二維陣列的首位址, 當然也可看成是二維陣列第0行的首位址。a+1就代表第1行的首位址, a+2就代表第2行的首位址。 如果此二維陣列的首位址為1000, 由於第0行有4個整型元素(每個整型元素佔2位元組), 所以a+1為1008, a+2 也就為1016。如圖2.所示
a[3][4]
a ┏━┳━┳━┳━┓
(1000)─→┃0 ┃1 ┃2 ┃3 ┃
a+1 ┣━╋━╋━╋━┫
(1008)─→┃4 ┃5 ┃6 ┃7 ┃
a+2 ┣━╋━╋━╋━┫
(1016)─→┃8 ┃9 ┃10┃11┃
┗━┻━┻━┻━┛
圖2.
既然我們把a[0], a[1], a[2]看成是一維陣列名, 可以認為它們分別代表它們所對應的陣列的首位址, 也就是講, a[0]代表第 0 行中第 0 列元素的位址, 即&a[0][0], a[1]是第1行中第0列元素的位址, 即&a[1][0], 根據位址運算規則, a[0]+1即代表第0行第1列元素的位址, 即&a[0][1], 一般而言, a[i]+j即代表第 i行第j列元素的位址, 即&a[i][j]。
另外, 在二維陣列中, 我們還可用指標的形式來表示各元素的位址。如前所述, a[0]與*(a+0)等價, a[1]與*(a+1)等價, 因此a[i]+j就與*(a+i)+j等價, 它表示陣列元素a[i][j]的位址。
因此, 二維陣列元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j), 它們都與a[i][j]等價, 或者還可寫成(*(a+i))[j]。
另外, 要補充說明一下, 如果你編寫乙個程式輸出列印a和*a, 你可發現它們的值是相同的, 這是為什麼呢? 我們可這樣來理解: 首先, 為了說明問題, 我們把二維陣列人為地看成由三個陣列元素a[0], a[1], a[2]組成, 將a[0], a[1], a[2]看成是陣列名它們又分別是由4個元素組成的一維陣列。因此, a表示陣列第 0行的位址, 而*a即為a[0], 它是陣列名, 當然還是位址, 它就是陣列第0 行第0
列元素的位址。
二. 指向乙個由n個元素所組成的陣列指標
在turbo c中, 可定義如下的指標變數:
int (*p)[3];
指標p為指向乙個由3個元素所組成的整型陣列指標。在定義中, 圓括號是不能少的, 否則它是指標陣列。這種陣列的指標不同於前面介紹的整型指標, 當整型指標指向乙個整型陣列的元素時, 進行指標(位址)加1運算, 表示指向陣列的下乙個元素, 此時位址值增加了2(因為放大因子為2), 而如上所定義的指向乙個由3個元素組成的陣列指標, 進行位址加1運算時, 其位址值增加了6(放大因子為2x3=6), 這種陣列指標在turbo c中用得較少, 但在處理二維陣列時, 還是很方便的。例如:
int a[3][4], (*p)[4];
p=a;
開始時p指向二維陣列第0行, 當進行p+1運算時, 根據位址運算規則, 此時放大因子為4x2=8, 所以此時正好指向二維陣列的第1行。和二維陣列元素位址計算的規則一樣, *p+1指向a[0][1], *(p+i)+j則指向陣列元素a[i][j]。
備註:
int a[10][20]; //真正的二維陣列
int *b[10]; //定義分配了10個指標,沒有初始化。換句話說,b是乙個由10個整型(int)指標構成的指標陣列。
int (*p)[3]; //指向陣列的指標
int *p(); //p是乙個函式,返回值是乙個int型指標
int (*p)(); //指向函式的指標
float **p; // p不是二維陣列的指標,而是指向指標的指標,即二級指標。
為什麼python預設引數一定要指向不可變物件
python語言中,函式的預設引數必須指向不可變物件。舉個簡單的例子 def test l return l print test print test print test 得到的結果是 a a a a a a 原因就在於函式的預設引數在函式定義時就已經被計算出來了,也就是l指向的記憶體位置已經確...
指向陣列的指標
陣列 array 是一系列具有相同型別的資料的集合,每乙份資料叫做陣列元素 element 陣列中的所有元素在記憶體中是連續排列的,整個陣列占用的是一塊記憶體。定義陣列時,要給出陣列名和陣列長度,陣列名可以認為是乙個指標,它指向陣列的第0個元素。在c語言中 我們將0個元素的位址稱為陣列的首位址。in...
指向陣列的指標
乙個陣列儲存在一塊連續記憶體單元中 陣列名就是這塊連續記憶體單元的首位址 第 i 1 個陣列元素的位址可表示為 data i 或 data i 可以通過以下方式為指向陣列的指標賦值 int a 10 pa a 0 或者pa a 乙個指標變數可以指向乙個陣列元素。int ptr,data 10 ptr...