void get(int r,int c,int *ptr){
int i,j,k;
cout<<"Enter Elements of a matrix:"<<endl;
for(i=0;i<r;i ){
for(j=0;j<r;j ){
cin>>k;
*(ptr (i*c) j)=k;
}
}
}
This is my code.
*(ptr (i*c) j)=k;
Can anyone explain how the above line of code works?
CodePudding user response:
A pointer is an address in memory where some piece of information is stored. This address takes the form of a number. How many bits that number uses is platform-dependent.
Since that address is a number, we can do math with it.
*(ptr (i*c) j)=k;
Can be the following when we understand operator precedence and use whitespace.
*(ptr i * c j) = k;
We're adding the product of i
and c
; and then j
to the pointer. Then we're dereferencing that whole thing and copying rhe value of k
into it.
How this relates to arrays is that the following two lines of code are equivalent:
arr[1] = 456;
*(arr 1) = 456;
If you're dealing with a multi-dimensional array as a single block of memory, you need to multiply the column width by the number of rows down, and then add however many columns over your data is.
Perhaps a visual will help.
Let's consider a 3x3 2-dimensional array. We'll say we've initialized it 1-9.
1 2 3
4 5 6
7 8 9
Now, we can look at this as a 3x3 array, or... we can consider it a single dimensional array with 9 elements.
1 2 3 4 5 6 7 8 9
How can we access 5
?
Well, in the first case we would use something like: arr[1][1]
. In the second case, we know that 5
is at index 4, so how do we turn [1][1]
into [4]
?
Given the pattern arr[row][col]
we can multiply the row
by the length of each row, and then add the col
. So arr2d[1][1]
turns into arr1d[1 * 3 1]
. Lo and behold, 1 3 1
is 4
.
Try this with a bigger array:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
To get the value 18
we would access: arr2d[3][2]
but if this were treated as a single dimensional array: arr1d[3 * 5 2]
which is arr1d[17]
which gets us... 18
.