我們通常情況下是這樣定義乙個二維陣列的:
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...