C++ 浮点**的指针解引用无法读取内存

C++ 浮点**的指针解引用无法读取内存,c++,pointers,dereference,C++,Pointers,Dereference,我有一个C++类MatRIX2,包含一个公共方法,()(代码)>,一个受保护的成员, m < /C> >,在这里声明 public: void foo(); protected: float m[2][2]; 假设数组m的全部内容在构造函数中初始化为零 在另一个函数的某个地方,我在堆栈上声明了一个Matrix2 Matrix2 MAT; 然后,在同一个函数中,我调用一些函数foo,Matrix2类中的公共函数 MAT.foo(); 在foo()中,我设置了 之后,在foo中

我有一个C++类MatRIX2,包含一个公共方法,<代码>()(代码)>,一个受保护的成员,<代码> m < /C> >,在这里声明

 public:

 void foo();

 protected:

 float m[2][2];
假设数组m的全部内容在构造函数中初始化为零

在另一个函数的某个地方,我在堆栈上声明了一个Matrix2

Matrix2 MAT;
然后,在同一个函数中,我调用一些函数foo,Matrix2类中的公共函数

 MAT.foo();
在foo()中,我设置了

之后,在foo中,我打印出以下值

 cout << "m :: " << u << endl;
 cout << "u :: " << m << endl;
 cout << "&m[0][0] :: " << &(m[0][0]) << endl;
 cout << "m[0][0] :: " << m[0][0] << endl;
 cout << "u[0][0] :: " << u[0][0] << endl;

的确,数组和指针在某种程度上是可以互换的,但它们需要引用相同的元素类型。这里,
m
是一个[长度为2的
float
数组]的数组。如果要使用指针,只需使用正确的元素类型:

1 typedef float float_arr[2];
2 
3 
4 int main()
5 {
6     float m[2][2];
7                                                                                                                                                                                                          
8     float_arr *p = m;
9    
10     return 0;
11 }

某种类型的数组数组与指向某种类型的指针的指针不同。请参阅,例如,了解解释。您的
m
不是指向浮点的指针数组;它是一个两项浮点数组的两项数组,因此符号
m
(float[2])*
,而不是
float**
类型。如果要在不使用数组语法的情况下转储数组值,可以将
m
转换为
float*
,假设整个数组内容存储在内存中的连续位置。但这是在问问题……你已经在你的方法上犯了一个致命的错误:铸造。如果赋值的两边不匹配,您应该考虑为什么会出现这种情况,并将任意一边更改为正确的类型,而不是应用蛮力(C样式转换相当于蛮力),以使编译器忽略此错误。去掉该转换。重新编译。你得到了什么编译器错误?强制转换不会改变编译器错误告诉您的内容。使用强制转换时所做的只是消除错误消息——指针仍然不兼容,并且在运行程序时可以看到结果。了解何时需要使用强制转换。你的问题是
float**u=(float**)m。事实上,您需要在这里进行强制转换以使其编译,这应该是一个警告,说明您做错了事情。
1 typedef float float_arr[2];
2 
3 
4 int main()
5 {
6     float m[2][2];
7                                                                                                                                                                                                          
8     float_arr *p = m;
9    
10     return 0;
11 }