0

我有一个数组前:

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)is like ,用于多维数组的array[MAX_COL*row+col]一维数组实现,就像James Kanze在这篇文章的一个回复中提到的(第二个比第一个快)。

4

6 回答 6

5

您需要知道的第一件事是二维数组不是指向指针的指针。它们在内存中是连续的,因此您可以通过指向T(T是基本类型) 的指针来表示它们:

int arr[3][5];
int *p = &arr[0][0];

int array_1_2 = *(p + 5 * 1 + 2);
于 2013-03-15T08:53:58.973 回答
4

array[1][2]等于*( *(array + 1) + 2)

于 2013-03-15T08:56:40.803 回答
3

演示与访问数组同义的指针算术运算的示例。

#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;
} 
于 2013-03-15T09:06:08.390 回答
2

您的问题中有几个错误的假设:例如,array[1][2]不看第 7 位;它正在查看 的第二个数组元素中的第三个位置 array。的类型array是array[3] of array[5] of int; 当它转换为指针时,结果类型是指向数组 [5] 的指针int而不是指向 的指针int。soarray + 5 * 1 + 2)指数组的第 8 个元素,只有 5 个元素;即 35 * sizeof(int) 超出开头array (并且表达式仍然具有指向 array[5] of 的类型指针int)。

作为一般规则,如果你想模拟对多维数组的访问,你应该声明一个单维数组:

int array[columns * rows];

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

于 2013-03-15T09:30:36.003 回答
2

另一种表示是

*(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数组 [2] 和 3 因此,我们可以使用or ( (array+1)+2) 或考虑它以行主要形式实现的来获得你得到array[1][2]*(array[1]+2)*(array+1)array+1*5
*(array+1*5+2)

于 2013-03-15T11:35:55.993 回答
1

使用以下数组:

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;
于 2013-03-15T09:05:54.697 回答