C ++在指向结构的指针中访问类数组指针
Posted
技术标签:
【中文标题】C ++在指向结构的指针中访问类数组指针【英文标题】:C++ accessing class array pointer in a pointer to a structure 【发布时间】:2019-12-02 19:20:39 【问题描述】:我是 C++ 新手,我真的需要一些帮助。我正在尝试创建一个与 GSL Monte-Carlo 算法接口的结构(这对于本示例来说实际上并不重要)。我搜索了所有的 C++ 教程、*** 帖子和 GSL 文档,但没有成功。我正在使用犰狳包进行矩阵操作;它非常健壮。根据文档,我无法在结构中使用动态数组,因此我试图找到一种方法使我的结构变量 *M 指向我的数组 *L[] 中的值。我确信使用向量会更好,但 1) 其余代码(错误形式)已经使用指针,以及 2) 我将其视为一种学习体验。我很惊讶 *M 和 *L[] 的地址在我的代码中不一样。不那么重要的是,我对我的 std::cout 为每行打印不同数量的空格感到惊讶。代码在打印最后一个 std::cout 之前退出,如下面的输出所示。
感谢您的帮助!
#include "pch.h"
#include "stdio.h"
#include "complex"
#include "new"
#include "armadillo"
using namespace arma;
class Link
public:
arma::Mat<cx_double>::fixed<3, 3>* dir[4]; // pointer to directional SU(3) matrices
Link(); // default constructor
;
Link::Link() // default constructor - all directional matrices are the identity
for (size_t hcount = 0; hcount < 4; hcount++)
dir[hcount] = new arma::Mat<cx_double>::fixed<3, 3> fill::eye ; // create directional matrix in direction hcount
struct Param
Link* M;
;
int main()
const int size = 10;
Param* Parameters = new Param NULL ;
Link* L[size];
arma::Mat<cx_double>::fixed<3, 3> One fill::eye ;
for (size_t hcount = 0; hcount < 10; hcount++)
L[hcount] = new Link();
*L[hcount]->dir[1] = *L[hcount]->dir[1] + hcount * One; // Make each array element #1 unique
Parameters->M = L[0];
std::cout << "&L = " << &L << std::endl;
std::cout << "&Parameters->M = " << &Parameters->M << std::endl; // surprised that addresses are not the same
std::cout << std::endl;
std::cout << "&L[0] = " << &L[0] << std::endl;
std::cout << "&Parameters->M[0] = " << &Parameters->M[0] << std::endl;
std::cout << std::endl;
std::cout << "&L[5] = " << &L[5] << std::endl;
std::cout << "&Parameters->M[5] = " << &Parameters->M[5] << std::endl;
std::cout << std::endl;
std::cout << "&L[5]->dir[1] = " << &L[5]->dir[1] << std::endl;
std::cout << "&Parameters->M[5].dir[1] = " << &Parameters->M[5].dir[1] << std::endl;
std::cout << std::endl;
std::cout << "*L[5]->dir[1] = " << *L[5]->dir[1] << std::endl; // This works
std::cout << "*Parameters->M[5].dir[1] = " << *Parameters->M[5].dir[1] << std::endl; // This does not
std::cout << std::endl;
OUTPUT
&L = 0024F7CC
&Parameters->M = 004EEFD8
&L[0] = 0024F7CC
&Parameters->M[0] = 004E0578
&L[5] = 0024F7E0
&Parameters->M[5] = 004E05C8
&L[5]->dir[1] = 004E50C4
&Parameters->M[5].dir[1] = 004E05CC
*L[5]->dir[1] = (+6.000e+00,+0.000e+00) (0,0) (0,0)
(0,0) (+6.000e+00,+0.000e+00) (0,0)
(0,0) (0,0) (+6.000e+00,+0.000e+00)
*Parameters->M[5].dir[1] =
【问题讨论】:
【参考方案1】:&L
是L
的地址,所以它是指向第一个元素的指针的地址,而不是第一个元素本身的地址。 & Parameters->M
也一样。那是来自Parameters
的成员M
的地址。您想将L[0]
与Parameters->M
进行比较,除非M 不应指向L[0]
所指的元素,而是指向数组本身的开头,然后您想将其与L
进行比较。但是你也必须改变分配。
我觉得使用指针数组有点奇怪。只需使用Link
s 的数组即可。
【讨论】:
我想我理解您的评论,但我不确定如何进行必要的更改。 我想我理解您的评论,但我不确定如何进行必要的更改。您似乎在建议类似 " &( Parameters->M[0] ) = &L[0]; " 但当然这有错误的语法。你能建议一个编码解决方案吗?另外,我希望对 M 使用指针数组,因为 1)我的 L 数组确实很大(这是一个简化版本),2)在我的实际代码中,它的长度是动态定义的 我认为你想要Parameters->M = L
。然后Parameters->M[i] == L[i]
代表所有0 <= i < size
。
Parameters->M = L 给出错误:“Link **”类型的值不能分配给“Link *”类型的实体。类似地,Parameters->M[i] = L[i] 上的循环产生错误:没有运算符 "=" 匹配这些操作数。我已经尝试了所有我能想到的变体,但没有任何效果。编译器几乎总是正确的,但在这种情况下我无法弄清楚。
解决了!在我的结构中,我声明了 Link *M[10]。然后我在Parameters->M[hcount] = L[hcount]上做了一个循环。现在 *L[5]->dir[1] 与 *Parameters->M[5]->dir[1] 相同,所有内存地址都应如此。感谢您指出正确的方向。
以上是关于C ++在指向结构的指针中访问类数组指针的主要内容,如果未能解决你的问题,请参考以下文章