将二维数组赋值表示为指针数学
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)
之外包含第二个***(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个位置;这是的第二个数组元素中的第三个位置array
。array
的类型为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]
。其中p1
、p2
、p3
分别表示指针指向第一行、第二行和第三行第一个元素。
因此,实际上我们可以将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;
- 数组指针表示法C++(移动数组时)
- 使用指针计算堆栈问题的大 O 表示法
- 使用 int 指针的浮点数的位表示形式
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- C++指针表示法
- char p[0]表示自动分配的缓冲区还是安全指针
- 如何以指针格式表示多维数组?
- 如何将升压数组表示为类型的指针?
- C 中的动态数组(用指针表示) - 输入元素
- 在 C 和指针表示法中放置星号的位置C++
- 如何在指针表示法和数组表示法中循环遍历二维数组
- 使用指针表示法在数组中循环
- 将引用转换为 C++ 中的指针表示形式
- 使用指针表示堆栈
- 尝试在此测试分数程序上使用指针表示法而不是数组表示法,但我被困住了
- 如何在c++中将指针表示的2D数组转换回2D数组
- 使用指针表示法从矩阵中读取数据
- 使用指针表示法反转cstring时出现意外结果
- 我可以用指针表示多维数组吗?
- 使用指针表示法访问结构数组