二維陣列與二維指標

2021-08-28 17:44:06 字數 2899 閱讀 1268

一.指標與二維陣列(以martix[3][4]為例):

1.二維陣列的本質:int martix[3][4]

int martix[3][4] => int[4]  martix[3],令int[4]為type, 

type martix[3]為含有三個元素的陣列,每乙個元素型別為int[4],int[4]是乙個擁有4個int型別元素的一維陣列.

2.martix名稱含義(本質:二維陣列的首位址常量):

&martix[0][0]    //取二維陣列第零行、第零列元素的首位址。

&martix[0][0] => &(martix[0][0]) => &(*(martix+0)[0]) => &(*martix[0]) => &(*(*(martix+0))) => &(*(*martix)) => *martix.

martix[0][0]為二維陣列第零行的第零個元素,其首位址為整個二維陣列的首位址.

3.int martix[3][4]的指類: 

#include int main()
對於一維陣列名稱與其對應的同指類指標變數(根據上述**執行結果講解):

double array[10],  *p=array; //array、p的指類是double;

array[10] <=> p[10]成立,若陣列名稱arrray為實參,那麼形參就必須用類似於p型別的變數與之對應,

例:fun(double*p)

fun(array);

將上述說法擴充套件至一般形式:type array[n],*p = array;

type可以是任意有效資料型別,以double[4]為例:

double[4] arrary[3], double[4]*p;這種格式c編譯器不接受,需要調整, 

double[4] array[3]  => double array[3][4];

double[4]*p => double (*p)[4] //這裡注意,*p必須加小括號,因為的運算優先順序高於*,會成為double *(p[4]),改變原含義。

若忽略變數名稱 =>double(*)[4].

綜上所述, 二維陣列的型別是double(*)[4];

#include int main()
4.關於*martix和&martix[3][4]:

*martix => *(martix + 0) => martix[0];

&martix[0][0] => *martix => martix[0],

&martix[1][0] => &(*(martix[1]+0)) => &(*(martix[1])) => martix[1],

&martix[2][0] => &(*(martix[2]+0)) => &(*(martix[2])) => martix[2],

綜上所述:martix[i]為二維陣列的行指標.

martix[0]的指類:

*martix,對指標產生降階作用,martix的指類是double[4],經過降階後指類為double,所以martix[0]的指類是double.

martix[i]+1將移動8位元組。

5.關於&martix:

double martix[3][4],

*(martix + i)中:

martix + i將移動i*sizeof(double[4])個位元組,實際就是移動行指標,

*具有降階作用,*(martix+i)的指類就是double型別,即,martix[i]是指標,是下標為i行的首位址,其指類是double型。

(martix[i]+j) => *(martix[i] + j)

martix[i] + j 事實上移動了j*sizeof(double)個位元組。

因為martix的型別是double(*)[4],則&martix的指類就是double(*)[4],

&martix+1移動96個位元組。//根據上述條件,martix的型別就是double[3][4],則&martix+1移動sizeof(double[3][4])個位元組.

二.二維陣列和二維指標種類:

1.二維陣列(陣列的陣列):

double martix[3][4];

實參:double martix[3][4], 形參:double (*)[4];

訪問:一般使用martix[i][j]訪問元素。

#include void su(double (*p)[4]);

void su(double (*p)[4])

int main()

2.指標陣列:

double *martix[4];

實參 double *martix[4], 形參double**martix,

訪問:使用*(martix[i]+j)訪問元素.

#include void su(char **p);

void su(char **p)

int main()

; su(martix);

return 0;

}

3.指向指標的指標:

char **martix;

實參 char**marix, 形參char**martix;

訪問: *(*(martix+i)+j).

#include void su(char **p);

void su(char **p)

int main()

,**martix = p;

su(martix);

return 0;

}

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...

二維陣列 二維陣列和指標

include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...