繁体   English   中英

将二维数组分配表示为指针数学吗?

[英]Representing a two-dimensional array assignment as a pointer math?

我有一个数组前:

int array[3][5];

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

array[1][2] = 8;

但是,我想用指针数学来表示它,这是正确的吗?

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

在这两种情况下,它都在寻找第7个位置...我只是不确定是否需要在(code)之外加上第2个*

**(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( "%d\n",array[2][3]);
printf( "%d\n",*(*(array+2)+3) );
return 0;
} 

您有两个错误的假设:例如, array[1][2]不在第7位; 它看起来在第二数组元素中的第三位置array array的类型是int的array [5]的a​​rray [3]; 当将其转换为指针,所得到的类型是一个指针数组[5]的int ,而不是一个指针int 因此array + 5 * 1 + 2)指的是只有5个元素的数组的第八个元素; 即35 * sizeof(int)超出array的开头(并且表达式仍然具有指向int array [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类似于array [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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM