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;
}
}
}
这是我的代码。
*(ptr + (i*c) + j)=k;
谁能解释一下上面这行代码是如何工作的?
指针是存储信息的内存地址。这个地址采用数字的形式。该数字使用多少位取决于平台。
由于这个地址是一个数字,我们可以用它做数学运算。
*(ptr + (i*c) + j)=k;
当我们理解了操作符优先级并使用了空格时,可以是以下形式:
*(ptr + i * c + j) = k;
加i
和c
的乘积;然后j
到指针。然后我们对整个东西进行解引用,并将k
的值复制到其中。
与数组的关系如下两行代码是等价的:
arr[1] = 456;
*(arr + 1) = 456;
如果将多维数组作为单个内存块处理,则需要将列宽度乘以向下的行数,然后在数据上添加多少列。
也许视觉效果会有所帮助。
让我们考虑一个3x3的二维数组。我们将它初始化为1-9
1 2 3
4 5 6
7 8 9
现在,我们可以把它看作一个3x3数组,或者…我们可以认为它是一个有9个元素的一维数组。
1 2 3 4 5 6 7 8 9
如何访问5
?
嗯,在第一种情况下,我们会使用:arr[1][1]
。在第二种情况下,我们知道5
位于索引4,那么我们如何将[1][1]
转换为[4]
呢?
给定模式arr[row][col]
,我们可以将row
乘以每行的长度,然后加上col
。所以arr2d[1][1]
变成了arr1d[1 * 3 + 1]
。瞧,1 + 3 + 1
就是4
。
用更大的数组试试:
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
要获取值18
,我们将访问:arr2d[3][2]
,但如果将其视为单维数组:arr1d[3 * 5 + 2]
,即arr1d[17]
,这使我们…18
.