星期二, 2月 28, 2017
[ C ] 2D Array多種用法
C是以陣列的第一個元素當作陣列的位址。
因此我把Array_1[0][0]給傳出去當參數。
並且使用&把他的位址。
MultiplyPointer(&Array_1[0][0]);
接下來就是重點了,如果我給一個陣列,
int arr2[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
這樣的方式會印出第0行第1列的元素
printf("###%d\n", *(*(arr2)+1));
// ###1
如果是這樣的方式,會印出第1行第0列的元素
printf("###%d\n", *(*(arr2+1)));
// ###4
所以*(arr2+i)是要印出第i行的意思,
而*(*(arr2+i)+j)是要印出第i行第j列。
下面這function是要做相乘的動作。
void MultiplyPointer(int *Array)
第i行乘第j列的數字。
*((Array+i*4)+j) = i*j;
為什麼要乘以4??
這就要講到array的話,要把他當作一維來思考,
電腦記憶體都是用連續空間來配置,
因此4X4的array會被看作是:
(0,0) (0,1) (0,2) (0,3) (1,0) (1,1) (1,2) (1,3) (2,0) (2,1) (2,2) (2,3) (3,0) (3,1) (3,2) (3,3)
所以程式內是i=0~3, j=0~3,
代表我要從第0行開始相乘到0~3列,
*((Array+0*4)+0) = 0*0;
*((Array+0*4)+1) = 0*1;
*((Array+0*4)+2) = 0*2;
*((Array+0*4)+3) = 0*3;
*((Array+1*4)+0) = 1*0;
*((Array+1*4)+1) = 1*1;
*((Array+1*4)+2) = 1*2;
*((Array+1*4)+3) = 1*3;
*((Array+2*4)+0) = 2*0;
*((Array+2*4)+1) = 2*1;
*((Array+2*4)+2) = 2*2;
*((Array+2*4)+3) = 2*3;
以連續的來看就會知道為什麼要乘以4了,
因為每四個就會跳一個行,
所以要乘以4來做換行的動作。
如果是4x4的大小陣列,那系統就會用直線的方式來分配空間。
4*4*sizeof(int)
由於是連續空間,所以可以換另一種方式來用array。
Array[i*4+ j] = i*j;
代表我每一個元素都是一個int,所以一直用+1的方式來指到下一個位置。
而一開始用指標的方式是指,雙重指標的概念來存取值。
*(arr2+1)是指第一個的位置的值,
*(*(arr2+1)+1)是指我已經在第一個位置了,然後請再往下一個,來取下一個的值。
SourceCode
Ref_1
Ref_2
Ref_3
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言