C 二維陣列,以及自定義二維陣列

2022-06-21 05:36:11 字數 1997 閱讀 1711

我們通常情況下是這樣定義乙個二維陣列的:

int a[10][15];
我們分別檢視一下a,a[0],*a

都是一樣的值吧

我們可以這麼理解: a是乙個陣列的陣列

a是陣列首元素的位址,a的首元素是乙個15個元素的陣列,a[0]和a[0]的首元素(a[0][0])的位址是同乙個位址

所以有人可能會想int **pa 是不是 跟a同乙個型別的

我們可以嘗試下面的**:

int a[4][2]=0x1234;

int **ppa=a;

//嘗試寫入資料

**ppa=1;

我們發現段錯誤,說明出錯了,而且ppa並不能代表a

我們把a,*a,**a,ppa,* ppa列印出來

a和ppa的值相同沒問題,因為是指向同乙個位址,*a仍然是a的首位址,*ppa直接解引用了

所以**ppa相當於向0x1234寫入資料所以發生了段錯誤!

如果想理解好這個我們先看一下c語言多維陣列的記憶體是什麼樣的:

實際上,在記憶體中,多維陣列也是像一維陣列一樣是連續的,只不過我們把這個陣列抽象了一下,

我們讓這個陣列的首位址賦值給乙個int**指標,那麼這個指標會認為是乙個int*陣列的位址

(就是乙個陣列裡面儲存的都是指標),所以這樣解引用會發生錯誤

解決方法:

int (*pa)[2];//注意和int *pa[2]區別,後者是乙個儲存int*的陣列

比如我們在函式傳參的時候

這樣會導致後面的2是固定的,程式設計的時候會受到一些限制

int func(int (*pa)[2],int l);

int (*p)[2]的理解:

自增一次多走了sizeof第二個維度的長度

如果是函式定義的話,也可以:

int func(int a[2],int l)這樣a第乙個維度可以不是固定的,第二維度是固定的,也不是很方便,我們如果定義動態二維陣列的話一般不適用多維陣列,適用陣列的陣列

就是用乙個int**ppa來指向乙個區域,這個區域內每乙個元素都是乙個指標,每乙個指標都指向乙個陣列

const int col = 5;

const int row = 5;

int **t = (int **)malloc(col*sizeof(int*));

for(int i = 0;i當然,我們也可以把這些不連續的小空間放在一起申請

int **t = (int **)malloc(col*sizeof(int*));

int *p = (int*)malloc(col*row*sizeof(int));

for(int i = 0;i < col;i++)

t[i]=p+col*i;

php二維陣列自定義排序

arr array 0 array id 1,price 200 1 array id 2,price 300 2 array id 3,price 100 3 array id 4,price 120 4 array id 5,price 130 5 array id 6,price 140 6 ...

php二維陣列自定義排序

php一維陣列的排序可以用sort asort arsort 等函式,但是php二維陣列的排序需要自定義。以下函式是對乙個給定的二維陣列按照指定的鍵值進行排序,先看函式定義 function array sort arr,keys,type asc if type asc else reset ke...

php二維陣列自定義排序

php一維陣列的排序可以用sort asort arsort 等函式,但是php二維陣列的排序需要自定義。以下函式是對乙個給定的二維陣列按照指定的鍵值進行排序,先看函式定義 function array sort arr,keys,type asc if type asc else reset ke...