[英]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]的array [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]
。 其中p1
, p2
, p3
代表指向第二行和第三行的第一元素的指针。
因此,实际上我们可以将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.