将二维数组赋值表示为指针数学



我有一个数组:

int array[3][5];

如果我想给数组中的元素赋值,这很简单…例:

array[1][2] = 8;

然而,我想在指针数学中表示它,这是正确的吗?

**(array + 5 * 1 + 2) = 8;

在这两种情况下,它都在寻找第7个位置…我只是不确定是否需要在(code)

之外包含第二个*
**(code)

编辑:只是一点跟进。谢谢每一个帮助我的人。我的困惑来自于讲师笔记中的一个错误,在我展示了你提供的信息之后,他意识到了这个错误,并同意

*(*(array+row)+col) 

*(*array+MAX_COL*row+col) 

是二维数组的精确指针数学表示。

**(array+MAX_COL*row+col)类似于array[MAX_COL*row+col],用于多维数组的单维数组实现,就像James Kanze在这个帖子的一个回复中提到的(第二个比第一个快)

首先您需要知道的是二维数组不是指针指向指针。它们在内存中是连续的,所以你可以用一个指向T的指针来表示它们(T是基本类型):

int arr[3][5];
int *p = &arr[0][0];
int array_1_2 = *(p + 5 * 1 + 2);

array[1][2] = *( *(array + 1) + 2)

一个指针算术操作的示例。

#include<stdio.h>
int main()
{
int array[3][5] = {0};
array[2][3] = 5;
printf( "%dn",array[2][3]);
printf( "%dn",*(*(array+2)+3) );
return 0;
} 

你的问题中有几个错误的假设例如,array[1][2]并不着眼于第7个位置;这是的第二个数组元素中的第三个位置arrayarray的类型为int的array[5]中的array[3];当它转换为指针时,生成的类型是指针对于int的数组[5],不是指向int的指针。因此,array + 5 * 1 + 2)指的是带有only的数组的第八个元素5元素;即35 * sizeof(int)超出array的开始(表达式仍然有指向int的数组[5]的类型指针)。

作为一般规则,如果您想模拟对对于多维数组,应声明为单个维度数组:

int array[columns * rows];

如果你这样做,那么*(array + i * columns + j)将有效地执行二维索引

另一种表示是

*(array[1]+5)=8

让我解释一下简单的类比代码。

int *p[5];

这里p是指向第一个元素地址的指针,p相当于&p[0]

要理解这一点,请以

为例
#include<iostream.h>    
void main()
{    
int *p[2];
int a=0,b=1;
p[0]=&a;p[1]=&b;
cout<<*p<<endl<<&a<<endl;
cout<<*(p+1)<<endl<<&b<<endl;
cout<<p<<endl<<p+1<<endl;
cout<<**p<<endl<<**(p+1);    
}
上面代码的输出是
0x8fbdfff0
0x8fbdfff0
0x8fbdffee
0x8fbdffee
0x8fbdfff2
0x8fbdfff4
0
1

在本例中,int array[3][5]等价于int *p1[5] int *p2[5] int *p3[5]。其中p1p2p3分别表示指针指向第一行、第二行和第三行第一个元素。

因此,实际上我们可以将array[3]视为指针,array[1]等效于p1,类似于数组[2]和3因此,为了获得array[1][2],我们可以使用*(array[1]+2)((array+1)+2),或者考虑到它以行主要形式实现*(array+1)相当于array+1*5,您得到
*(array+1*5+2)

使用以下数组:

const int ROWS = 3;
const int COLS = 5;
int arr[ROWS][COLS];

虽然arr指向第一个元素所在的内存,但它的类型不是int*,因此增加该指针不会将您移动到第二个int。所以这一行:

arr[1][2] = 8;

可以替换为:

*((int*)arr + 1*COLS + 2) = 8;

或者您可以使用这个事实,这个数组驻留在连续的内存块中,其大小等于ROWS * COLS * sizeof(int),因此您可以简单地检索指向第一个元素的指针并将其用于此目的:

int* pFirstEle = &arr[0][0];
*(pFirstEle + 1*COLS + 2) = 8;

但是注意这是错误的:

**(arr + 1*COLS + 2) = 8;