指向陣列的指標 一定要好好看看這個文章

2021-06-19 20:19:38 字數 2317 閱讀 4683

一. 二維陣列元素的位址 

為了說明問題, 我們定義以下二維陣列: 

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...