一.指標與二維陣列(以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 ...