我正在尝试根据其他人创建一个二维指针数组。这是一个基础2d数组:
double **a = new double*[3];
a[0] = new double[3]{ 1, 2, 3 };
a[1] = new double[3]{ 4, 5, 6 };
a[2] = new double[3]{ 7, 8, 9 };
我想要创建一个2x2矩阵,它应该是这样的:
5,6
8,9
最后,我正在尝试解决问题如下:
double **b = &a[1];
b[0] = a[1];
b[1] = a[2];
不幸的是,此代码无法正常工作。另外,我想使用负面索引来访问数据,例如。 b [-1] [ - 1]应该返回1个值。
答案 0 :(得分:0)
这种方法无法奏效。这种二维数组的一个属性是&A[k+1] = &A[k]+1
,但是这种关系不适用于您想要的B[0]
和B[1]
,因为它们实际上是&A[1][1]
和{{1}这可能相隔数英里。
您的代码实际执行的是:
&A[2][1]
答案 1 :(得分:0)
使用:
double a0[] = { 1, 2, 3 };
double a1[] = { 4, 5, 6 };
double a2[] = { 7, 8, 9 };
double* b0[3] = {&a0[1], &a1[1], &a2[1]};
double** b = &b0[1];
您可以使用否定索引进行访问并执行:
for (int i = -1; i != 2; ++i) {
for (int j = -1; j != 2; ++j) {
std::cout << b[i][j] << std::endl;
}
}
答案 2 :(得分:0)
这可能会帮助你解决问题,让你走上正确的道路。
#include <conio.h>
#include <iostream>
struct Vec3 {
union {
double d3[3];
struct {
double x;
double y;
double z;
};
};
double& operator[]( int idx );
};
double& Vec3::operator[]( int idx ) {
return d3[idx];
}
typedef Vec3 Row;
struct Matrix {
union {
Row r[3];
struct {
Row row1;
Row row2;
Row row3;
};
};
Row& operator[]( int idx );
};
Row& Matrix::operator[]( int idx ) {
return r[idx];
}
int main() {
Matrix m;
m.row1.x = 1;
m.row1.y = 2;
m.row1.z = 3;
m.row2.x = 4;
m.row2.y = 5;
m.row2.z = 6;
m.row3.x = 7;
m.row3.y = 8;
m.row3.z = 9;
for ( int i = 0; i < 3; i++ ) {
for ( int j = 0; j < 3; j++ ) {
m[i][j] += 10;
std::cout << m[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << "Press any key to quit" << std::endl;
_getch();
return 0;
}
我没有添加任何错误检查或边界检查到重载操作符我只是允许用户将任何值传递给它。您必须根据自己的特定需求进行设计。我只是演示了一种使用联合创建2D数组或Matrix对象的简单方法,以便快速访问下标或括号运算符。我展示了创建3x3矩阵的示例用法,每个值的范围为1-9,然后我使用double for循环为每个值添加10,然后使用双括号打印出数组中的新值。这一切都是在堆栈上完成的,这比使用指针和为每个地方创建新内存更好。如果您需要使用堆,那么您可以将此矩阵类指定为自己的指针,并在堆上创建它而不是每个单独的元素。另一件可以做到的事情是,如果你需要使用它来表示int,float或其他一些数据类型,你可以轻松地模拟这个类或结构。
用负值索引;我没有听说有人这样做过。这并不是说它无法完成,而是从我记得的指针和指针的方式来看。数组根据它们与内存寻址的关联进行索引,它们是基于0的索引。这通常意味着如果我们有一个内存块指向一个双类型变量的指针,这通常意味着在大多数情况下每个内存块是8字节宽。第一个元素驻留在为堆栈和堆分配给此变量的第一个内存地址位置。如果您尝试使用涉及指针算术的负数,则开始遍历不属于此声明变量的内存。要尝试推出你所建议的内容可能需要的不仅仅是基本的C / C ++代码可以做的事情,你可能不得不深入研究asm以使这样的东西工作,特别是如果你想避免在重载的运算符中使用if语句