c語言二維數(shù)組的下標(biāo)運(yùn)算與指針偏移
首先,定義一個(gè)二維數(shù)組int Array[y][x];
????一、?對(duì)于二維數(shù)組的指針偏移的運(yùn)算法則。同一維數(shù)組一樣,二維數(shù)組的數(shù)組名也是指向第一個(gè)數(shù)組元素的(即Array等于&Array[0][0]),且二維數(shù)組的數(shù)組元素在計(jì)算機(jī)內(nèi)的內(nèi)存存放也是連續(xù)的,但不一樣的是:Array+1的值不是&Array[0][1],而是&Array[1][0](即,對(duì)于二維數(shù)組Array[][x],指針Array+1中的1表示的字節(jié)數(shù)是sizeof(int)*x,而不是sizeof(int),若要表示Array[i][l]的地址,應(yīng)該是 *(Array+i)+l,要復(fù)引用a[i][l],則應(yīng)該是*(*(Array+i)+l)。
????? 但是注意,同一、二維數(shù)組名一樣,雖然Array+1的值等于第二行第一個(gè)元素的地址,但是使用指針運(yùn)算符引用? *(Array+1)得到值依然只是一個(gè)地址。
???? 二、指向二維數(shù)組的指針。
???? 如果建立一個(gè)這樣的指針? int *ptr=Array? ,則對(duì)ptr的指針和下標(biāo)運(yùn)算和指向一維數(shù)組一樣。對(duì)于Array這個(gè)二行三列的二維數(shù)組來說,ptr[i*x+l]表示的是第i行第l列的元素,因?yàn)槎S數(shù)組的元素在內(nèi)存中實(shí)際上也是線性存放的,所以ptr[i*x+l]訪問到的第i*x+l個(gè)元素就是第i行第l列的元素(雖然編譯器會(huì)報(bào)錯(cuò))。另外對(duì)于這個(gè)指針不能采用ptr[i][l]的雙下標(biāo)運(yùn)算,即使它指向一個(gè)二維數(shù)組。
???? 如果建立一個(gè)這樣的指針? int(*ptr)[3]=Array? (表示建立一個(gè)指向有三列的二維數(shù)組的指針),則可以采用雙下標(biāo)運(yùn)算ptr[i][l],或者*(*(ptr+i)+l),這都等效于Array[i][l]。